1. go在编译和部署方面相比于Java更有优势,首先编译速度极快,支持交叉编译,并且运行编译后的二进制文件时并不需要go的环境,只需要编译成指定运行平台的二进制文件就可以了。

go是支持交叉编译的,也就是说在Windows平台可以编译成Windows上、Linux上、Mac上等可以运行的可执行程序。

  • 首先可以在控制台通过go env查看当前go相关的环境变量,注意两个变量GOOS和GOARCH:

GOOS:目标平台的操作系统(darwin、freebsd、linux、netbsd、openbsd、windows)

GOARCH:目标平台的体系架构(386、amd64、arm、mips、mips64、mips64le、mipsle)

  • 将这两个变量设置成目标平台的对应值。

  • 然后在目标项目的根目录,就是main函数所在目录的控制台中运行go build编译,也可指定主类文件和编译生成的文件名,在该目录中就会生成编译后的可执行程序的文件了,不过如果有配置文件,比如conf.init这种,是不会编译进去的,只编译go相关的,所以运行程序时需要把配置文件和可执行程序放在一起运行。

  • 在Mac下编译Linux和Windows 64位可执行程序:

    # Linux
    GOOS=linux GOARCH=amd64 go build -i -o hello hello.go
    # Windows
    GOOS=windows GOARCH=amd64 go build -i -o hello hello.go
  • 在linux下编译Mac和Windows 64位可执行程序:

    # Darwin (Mac OS)
    GOOS=darwin GOARCH=amd64 go build -i -o hello hello.go
    # Windows
    GOOS=windows GOARCH=amd64 go build -i -o hello hello.go
  • 在Windows下编译Mac和Windows 64位可执行程序:

    # Darwin (Mac OS)
    SET GOOS=darwin
    SET GOARCH=amd64
    go build -i -o hello hello.go
    # Liunx
    SET GOOS=linux
    SET GOARCH=amd64
    go build -i -o hello hello.go
  1. 编译完成了,接下来可以将可执行程序放到目标平台上执行了,这里用Linux平台作为目标平台,编译前注意看下目标Linux平台时多少位的操作系统,编译成指定位的,少走一步坑。比如现在生成的可执行程序是hello。
    将可执行程序hello和配置文件(如果有的话)放到目标平台的指定目录下。
  • 修改可执行程序hello的权限,chmod 755 hello。

  • 最简单的执行方式./hello,但是这样的问题是如果我们ctrl+c退出了进程,这个进程也就死掉了,所以我们需要让进程一直在后台执行,使用nohup ./hello &,关于nohup指令回头再总结,最简单的方式实现了进程在后台执行。

  • 这里还有两个小坑,一个是hello进程起不来,端口被其他进程占用了,比如8899端口,lsof -i:8899查看端口占用情况,进一步通过netstat -nap | grep 占用端口PID查看进行情况。

  • 进程起来后,客户端访问不了,日志也没有反应,比较大的可能是防火墙的问题,iptables -L -n看下开放的端口情况,没开端口开一下。

  • 这里只是最简单的部署到Linux上,更多的部署到Google App Engine、阿里云、腾讯云、Docker都有各自的部署方式,先不展开了。