近期,搞了一个go语言的工程,目前google把go语言升级到了1.3的版本,结果出现了一些问题,现在分享如下:
工程当中的代码是用Sprintf来检测两个对象是否相同,
datas := make(map[string][]byte) datas["Jonny"] = []byte("Hsu") if fmt.Sprintf( "%#v",datas["Jonn"] ) == fmt.Sprintf("%#v",[]byte{}) { fmt.Println("------------ Equal ---------------") } else { fmt.Println("============Not Equal===============") }
原因是一个输出了[]byte(nil) 而另外一个则输出了[]byte{},所以导致的不相等
通过认真分析和比较,在go的src文件夹下使用命令 grep -rn "byte(nil)" 发现在go1.3中的fmt的print文件中找到了:
func (p *pp) fmtBytes(v []byte, verb rune, goSyntax bool, typ reflect.Type, depth int) {
if verb == 'v' || verb == 'd' {
if goSyntax {
if v == nil {
if typ == nil {
p.buf.WriteString("[]byte(nil)")
} else {
p.buf.WriteString(typ.String())
p.buf.Write(nilParenBytes)
}
return
}
if typ == nil {
p.buf.Write(bytesBytes)
} else {
p.buf.WriteString(typ.String())
p.buf.WriteByte('{')
}
} else {
p.buf.WriteByte('[')
}
for i, c := range v {
if i > 0 {
if goSyntax {
p.buf.Write(commaSpaceBytes)
} else {
p.buf.WriteByte(' ')
}
}
p.printArg(c, 'v', p.fmt.plus, goSyntax, depth+1)
}
可以知道[]byte(nil)是在此处输出,同样的函数当中,在go1.1的源码,却是:
func (p *pp) fmtBytes(v []byte, verb rune, goSyntax bool, typ reflect.Type, depth int) {
if verb == 'v' || verb == 'd' {
if goSyntax {
if typ == nil {
p.buf.Write(bytesBytes)
} else {
p.buf.WriteString(typ.String())
p.buf.WriteByte('{')
}
} else {
p.buf.WriteByte('[')
}
for i, c := range v {
if i > 0 {
if goSyntax {
p.buf.Write(commaSpaceBytes)
} else {
p.buf.WriteByte(' ')
}
}
比较之后方知有所不同,也可以理解为在go1.3当中,go语言对 没有元素的[]byte数组和空的[]byte类型分得更加清楚了,
综合体悟:
go1.1的处理方式和go1.3的处理方式有所不同,出了问题可以查找go的源码,进行深入挖掘,可以找到相关线索。
在此分享,以飨后来人。
By JonnyHsu
有疑问加站长微信联系(非本文作者)