普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式。 Printf("%v", people) {zhangsan}, %+v 打印结构体时,会添加字段名 Printf("%+v", people) {Name:zhangsan} %#v 相应值的Go语法表示 Printf("#v", people) main.Human{Name:"zhangsan"} %T 相应值的类型的Go语法表示 Printf("%T", people) main.Human %% 字面上的百分号,并非值的占位符 Printf("%%") % 布尔占位符 占位符 说明 举例 输出 %t true 或 false。 Printf("%t", true) true 整数占位符 占位符 说明 举例 输出 %b 二进制表示 Printf("%b", 5) 101 %c 相应Unicode码点所表示的字符 Printf("%c", 0x4E2D) 中 %d 十进制表示 Printf("%d", 0x12) 18 %o 八进制表示 Printf("%d", 10) 12 %q 单引号围绕的字符字面值,由Go语法安全地转义 Printf("%q", 0x4E2D) '中' %x 十六进制表示,字母形式为小写 a-f Printf("%x", 13) d %X 十六进制表示,字母形式为大写 A-F Printf("%x", 13) D %U Unicode格式:U+1234,等同于 "U+%04X" Printf("%U", 0x4E2D) U+4E2D 浮点数和复数的组成部分(实部和虚部) 占位符 说明 举例 输出 %b 无小数部分的,指数为二的幂的科学计数法, 与 strconv.
Read More →
进制对应的英文 name 中文名 含义 举例(以十进制为标准,10的转换) binary 二进制 满2进1 1010 Octal 八进制 满8进1 12 Decimal 十进制 满10进1 10 Hex 十六进制 满16进1 a 进制转换在线工具
golang中进制之间的相互转换 首先看看go自带的包 “encoding/hex” “encoding/binary”
重点分析 2、10、16进制之间的相互转换
hex 分析 func Encode(dst, src []byte) int { for i, v := range src { dst[i*2] = hextable[v>>4] dst[i*2+1] = hextable[v&0x0f] } return len(src) * 2 } Encode函数将src目标字节数组,转换成16进制形式的dst字节数组,数组长度翻倍
原理:将原来用一个字节表示的内容,用两个字节来表示,所以返回的dst是src的两倍长度
将原字节右移4位,得到高位内容(ascii码),放在第一个字节,原字节与0000 1111与,得到低位内容(ascii码),放到第二字节
func Decode(dst, src []byte) (int, error) { var i int for i = 0; i < len(src)/2; i++ { a, ok := fromHexChar(src[i*2]) if !
Read More →
安装dep go get -u github.com/golang/dep/cmd/dep
dep基本使用 dep init 执行这个命令会将当前目录下所有文件import的第三方工具进行打包
这个建议加上-v ,可以看日志
init是从网络上去下载对应的中间件,包很多的话,下载会非常慢
dep init -gopath 会先去本地找对应的包,没有的话,再去网络上下载
dep ensure -update 依据Gopkg.toml文件的信息获取制定版本的依赖
Gopkg.toml配置小结:
[[constraint]] name = "github.com/panjf2000/ants" version = "=3.6.0" 上述引用为例子:
"3.6.0" 约束使用 3.6.0 - 3.7.0 之间的最新版 "<=3.6.0" 约束使用最高版本为 3.6.0 "=3.6.0" 约束指定为3.6.0
aes加密详解
学习链接
tcp服务器 开启对服务器ip以及端口的监听
lis, err := net.Listen("tcp", ":6666") if err != nil { log.Fatalf("failed to listen:%v", err) } 用for循环从监听者处取发起拨号的连接
for { conn, err := lis.Accept() if err != nil { log.Fatalf("failed to accept:%v", err) continue } sendMessage(conn) time.Sleep(time.Second * 1) } 写两个函数用来收发消息
发消息:将需要发送的消息内容,通过相关的序列化操作,转化成字节流,将字节流通过write函数发送
func send(){ _,err := conn.Write([]byte(str)) if err != nil { log.Fatalf("failed to write:%v", err) } } 收消息:通过read函数将字节流读出来,然后通过相关的反序列化操作,得到想要的消息
func recv(){ b := make([]byte,1024) _,err := conn.
Read More →
英文学习链接 中文学习链接
submodule常用命令 新增:在当前库中没有submodule子模块,可以通过 git submodule add remote 添加子模块 删除:
git rm -fr submodule 删除 `./git/config` 文件中的相关submodule 删除 `./git/submodule` 中相关的子模块 新环境中拉取库中的子模块:
初始化`git submodule init` 更新`git submodule update` 拉取所有子模块的最新代码
git submodule foreach –recursive git pull origin master
git submodule update检出项目的指定版本(HEAD),并不指向一个分支。头指针和分支未绑定,是分离状态。 需要强制绑定
git branch -f master HEAD git checkout master 相关网页
redis的四大功能 multi watch discard exec
multi 词条意思是多、多个,这个命令的用途是用来开启事务的,开启事务后,之后执行的cmd命令,都会进入事务队列,并不会马上执行,只有当执行exec后, 队列中的命令才会按顺序进行,执行顺序是先进队列的先执行。如果有一条命令执行失败,那么整个事务都会失败,事务是原子性的。
127.0.0.1:6379> multi //开启事务 OK 127.0.0.1:6379> hset go 1 1 //第一条命令 QUEUED 127.0.0.1:6379> hset go 2 2 //第二条命令 QUEUED 127.0.0.1:6379> exec // 执行队列 1) (integer) 0 2) (integer) 1 discard discard是用来取消事务的,当事务还未执行时,想要取消multi的队列,可以用该命令取消,取消后队列中的所有命令都会取消。
127.0.0.1:6379> multi //开启事务 OK 127.0.0.1:6379> multi //再次开启(失败) (error) ERR MULTI calls can not be nested 127.0.0.1:6379> discard //取消事务 OK exec exec 如上所说,就是用来执行队列的,与multi组合使用
watch 监听事务 ,一般和multi、exec混合使用,watch用来监听某一个键,在事务开始前,如果当前监听的键被其他客户端改动,那么整个事务都会失败。
127.0.0.1:6379> watch go //客户端A监听go OK 127.
Read More →