最近学习go语言,还是比较有意思的,正好在交叉编译上遇到了一些问题,顺便把go从1.4升到了1.5,随手做个备忘。

安装

安装有很多方法,不过根本的方法只有一个——科学上网
不扯蛋,正经的。mac上安装的话可以科学上网之后去下最新版本的安装包,也可以下源码自己编译。下源码的话可以下压缩包编译,也可以通过git clone后编译。这里记一下go1.5版本git方式的安装,依赖系统上原先安装好的go1.4版本,记得科学上网。

export GOROOT_BOOSTRAP=/usr/local/go1.4
git clone https://go.googlesource.com/go
cd go
git checkout go1.5
cd src
./all.bash

然后就是等待,到看到下面的内容,就安装成功了

ALL TESTS PASSED

---
Installed Go for linux/amd64 in /home/you/go.
Installed commands in /home/you/go/bin.
*** You need to add /home/you/go/bin to your $PATH. ***

错误处理

安装1.7时候出现了这样一个错误

    --- FAIL: TestLldbPython (2.71s)
        runtime-lldb_test.go:182: Unexpected lldb output:
            2016-08-28 18:33:41.452 Python[56444:3903730] Metadata.framework [Error]: couldn't get the client port
            Created target
            Created breakpoint
            Process launched
            Hit breakpoint
            Stopped at main.go:10
            Stopped in main.main
            intvar = 42
    FAIL

很神奇的错误,找到代码那部分,按照里面测试用的代码去import lldb;能够正常import,Python环境并没有什么问题。后来在这里找到了解释https://github.com/Homebrew/legacy-homebrew/issues/29333,说是spotlite不能禁用,才想起我以前禁用过spotlite,按照上面的说法,开启spotlite服务,然后单独关掉index,就顺利通过了

    sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
    sudo mdutil -i off /

交叉编译

go是可以跨平台的,比如在mac上可以编译出linux和windows下用的程序。要编译这样的程序只需要一点点小步骤。

先说一下两个变量:$GOOS和$GOARCH,有下列几种组合:

$GOOS   $GOARCH
darwin  386
darwin  amd64
darwin  arm
darwin  arm64
dragonfly   amd64
freebsd 386
freebsd amd64
freebsd arm
linux   386
linux   amd64
linux   arm
linux   arm64
linux   ppc64
linux   ppc64le
netbsd  386
netbsd  amd64
netbsd  arm
openbsd 386
openbsd amd64
openbsd arm
plan9   386
plan9   amd64
solaris amd64
windows 386
windows amd64

还有一个变量$CGO_ENABLED,交叉编译不支持CGO所以禁用。继续在src目录下执行命令:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash --no-clean
CGO_ENABLED=0 GOOS=windows GOARCH=386 ./make.bash
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
.
.
.

简单举了几个栗子,其中--no-clean是能够加make的速度。

交叉编译最近碰到一个坑,需要对utf8转码,所以用了iconv-go的库,在mac上build是没有问题的,跑的爽爽的,然后想编译一个linux用的发现死都不成功,始终是找不到libiconv,后来想想是交叉编译不支持CGO,就放弃了,换用了mahonia,问题得到解决。

交叉编辑程序有几个方法,手动编译的话可以使用类似下面的命令:

GOOS=linux GOARCH=amd64 go build

这样出来的就是可以在linux64位中跑的可执行文件了,把OS和ARCH调整一下可以编译出你想编译的平台用的程序。除了手动的话也有不用手动的办法,用gox来一步到位编译出所有平台的程序,详见gox

升级

升级当前机器的go环境可以直接科学上网下载编译好的新版本包,或者如果用git方式安装的话可以参考下面步骤:

cd go/src
git fetch
git checkout <tag>
./all.bash

常用工具链

  1. 官方工具,一次性批量安装

    go get golang.org/x/tools/cmd/...
    
  2. 其他常见工具,一般用visual studio code做开发的话会需要用到

    go get -u -v github.com/nsf/gocode
    go get -u -v github.com/rogpeppe/godef
    go get -u -v github.com/golang/lint/golint
    go get -u -v github.com/lukehoban/go-outline
    go get -u -v sourcegraph.com/sqs/goreturns
    go get -u -v golang.org/x/tools/cmd/gorename
    go get -u -v github.com/tpng/gopkgs
    go get -u -v github.com/newhook/go-symbols
    go get -u -v golang.org/x/tools/cmd/guru