Hi,all:
我相信很多人都已经知道了Go 1.5存在一个重大Bug。它的issue在这里: https://github.com/golang/go/issues/12226 。
具体表现为下面这段代码
package main import "fmt" func main() { if []byte("abc")[0] == []byte("efg")[0] { fmt.Println("BUG: abc and efg appear to have the same first byte") } else { fmt.Println("No bug: abc doesn't start with efg") } }
会打印出以 BUG
开头的那行内容。这显然是个严重的错误。
在那个issue的讨论过程中,uli-go提出了一个patch并已经交给golang team来review了。不出意外的话,这个patch会被接受。
这个patch其实很简单,在文件 $GOROOT/src/cmd/compile/internal/gc/cgen.go 中找到2021行:
2018 Regalloc(&n2, nr.Type, nil) 2019 Cgen(nr, &n2) 2020 nr = &n2 2021 Regfree(&n2)
复制2021行的代码,然后找到2025行:
2021 Regalloc(&n1, nl.Type, nil) 2022 Cgen(&tmp, &n1) 2025 Regfree(&n1)
在2025行代码的最后敲回车,并黏贴代码 Regfree(&n2)
。最后删除掉2021行的那行代码。变更之后的代码片段如下:
2017 var n2 Node 2018 Regalloc(&n2, nr.Type, nil) 2019 Cgen(nr, &n2) 2020 nr = &n2 2021 2022 Regalloc(&n1, nl.Type, nil) 2023 Cgen(&tmp, &n1) 2024 Regfree(&n1) 2025 Regfree(&n2) 2026 } else { 2027 var n1 Node 2028 if !nl.Addable && Ctxt.Arch.Thechar == '8' {
修改完 cgen.go 这个文件之后,你需要从新编译、安装一遍Go语言的1.5版本。当然首先你需要在机器中有go1.4并把它放置到家目录中(在我的mac中,为这次编译放置的1.4版本的go在这里: /Users/haolin/go1.4),然后运行$GOROOT/src/all.bash。最后就是等待这个脚本运行完成了。在这之后,你可以用本贴开始处的那段程序进行验证。
请注意,这是一个纯手工的hack方法。如果你觉得不保险或者不想自己hack,那么就需要等到1.5.1版本的到来了(据称是9月下旬发布),并请在程序中避免如此比较两个字节切片。
傅小黑 5小时前 1楼
改改代码,换种写法好了