Go工程从1.1迁移到1.3出现错误

JonnyHsu · · 1174 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

近期,搞了一个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===============")
}


不过很奇怪的是,在go1.1版本下成功输出了Equal但是到了go1.3下缺输出了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


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:JonnyHsu

查看原文:Go工程从1.1迁移到1.3出现错误

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1174 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传