RE什么是Go语言

  • Google开源
  • 编译型语言
    • 编译型语言: 代码👉🏻解释器(虚拟机)👉🏻处理器
    • 解释型语言:代码👉🏻处理器
  • 21世纪的C语言
    • 支持交叉编译
    • 开发效率高
    • 支持高并发
    • 执行性能好

下载安装,配置环境变量

  • 直接从官网下载最新即可
  • 使用VScode编辑器,或者其他

环境变量

  1. ZEN@DESKTOP-0G2UB36 D:/Users/wangy/Desktop go version
  2. go version go1.16.3 windows/amd64
  • 删除默认GOPATH 添加新创建的GOPATH(1.14之后的新版本中启用了Go Module模式 ,此步骤为非必要)

image.png

  • GOPATH目录结构

image.png

  1. 目录: D:\Users\wangy\Documents\HBSI\go
  2. Mode LastWriteTime Length Name
  3. ---- ------------- ------ ----
  4. d----- 2021/04/14 9:19 bin
  5. d----- 2021/04/14 9:19 pkg
  6. d----- 2021/04/14 9:19 src
  7. ZEN@DESKTOP-0G2UB36 D:/Users/wangy/Documents/HBSI/go/tree
  8. 软件 的文件夹 PATH 列表
  9. 卷序列号为 E709-DB9D
  10. D:.
  11. ├─bin
  12. ├─pkg
  13. └─src
  14. └─github.com
  15. └─Yunak
  16. └─go01

配置代理

国内常用的GO代理

各个代理首页

设置PROXY后,安装所需依赖(使用VScode一直安装失败可直接再$GOPATH中执行以下命令安装)

  1. go get -v github.com/fatih/gomodifytags
  2. go get -v github.com/haya14busa/goplay/cmd/goplay
  3. go get -v honnef.co/go/tools/cmd/staticcheck
  4. go get -v github.com/josharian/impl
  5. go get -v github.com/go-delve/delve/cmd/dlv
  6. ···部分安装命令,详细可从vscode中查看

Go 版本是 1.13 及以上

  1. $ go env -w GO111MODULE=on
  2. $ go env -w GOPROXY=https://goproxy.cn,direct

其他版本

  1. $ export GO111MODULE=on
  2. $ export GOPROXY=https://goproxy.cn
  • 取消代理
    1. $ go env -u GOPROXY

查看GO的配置

  1. $ go env
  2. #以JSON格式输出
  3. $ go env -json

Go Mod是什么

  • go mod 是Golang 1.11 版本引入的官方包(package)依赖管理工具,用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。
    之前Golang 主要依靠vendor和GOPATH来管理依赖库,vendor相对主流,但现在官方更提倡go mod。
  • go mod初始化及使用
    Golang 提供一个环境变量 GO111MODULE 来设置是否使用mod,它有3个可选值,分别是off, on, auto(默认值),具体含义如下:
    • off: GOPATH mode,查找vendor和GOPATH目录
    • on:module-aware mode,使用 go module,忽略GOPATH目录
    • auto:如果当前目录不在$GOPATH 并且 当前目录(或者父目录)下有go.mod文件,则使用 GO111MODULE, 否则仍旧使用 GOPATH mode。

修改 GO111MODULE 的值的语句是:set GO111MODULE=on 。一般保持auto就行,建议设置为on
首先main入口代码所在文件夹创建mod

  • 创建语句 go mod init [module name]

编译

  • go bulid
  1. 在项目目录下执行go build
  2. 在其他路径下执行,需要在后面加上项目路径可从$GOPATH/src写起,编译后的文件保存在当前路径下
  3. go build -o filename

go run

像执行脚本一样执行Go源码

go install

  1. 先编译为一个可执行文件
  2. 将可执行文件复制到$GOPATH/bin

交叉编译

  • window编译linux mac win

    1. SET CGO_ENABLED=0 #禁用csgo
    2. SET GOOS=linux #目标平台 darwin(mac) windows(win)
    3. SET GOARCH=adm64 #平台架构
  • Linux 下编译 Mac 和 Windows 平台64位可执行程序:

    1. CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
    2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能

Mac下编译Linux, Windows平台的64位可执行程序:

  1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go
  2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

Linux下编译Mac, Windows平台的64位可执行程序:

  1. CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go
  2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

Windows下编译Mac, Linux平台的64位可执行程序:

  1. SET CGO_ENABLED=0SET GOOS=darwin3 SET GOARCH=amd64 go build test.go
  2. SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build test.go

注:如果编译web等工程项目,直接cd到工程目录下直接执行以上命令

  • GOOS:目标可执行程序运行操作系统,支持 darwin,freebsd,linux,windows

  • GOARCH:目标可执行程序操作系统构架,包括 386,amd64,arm

  • go build [-o 输出名] [-i] [编译标记] [包名]

指令解析

  • -o 指定输出文件

  • -a 强行对所有涉及到的代码包(包括标准库中的代码包)进行重新构建,即使它们已经是最新的了

  • -n 打印构建期间所用到的其它命令,但是并不真正执行它们

  • -p n 构建的并行数量(n)。默认情况下并行数量与CPU数量相同

  • -race 开启数据竞争检测。此标记目前仅在linux/amd64、darwin/amd64和windows/amd64平台下被支持

  • -v 打印出被构建的代码包的名字

  • -work 打印出临时工作目录的名字,并且取消在构建完成后对它的删除操作

  • -x 打印出构建期间所用到的其命令

编译

Windows编译Linux可执行文件

如果我想在Windows下编译一个Linux下可执行文件,那需要怎么做呢?只需要在编译时指定目标操作系统的平台和处理器架构即可。

注意:无论你在Windows电脑上使用VsCode编辑器还是Goland编辑器,都要注意你使用的终端类型,因为不同的终端下命令不一样!!!目前的Windows通常默认使用的是PowerShell终端。

如果你的Windows使用的是cmd,那么按如下方式指定环境变量。

  1. SET CGO_ENABLED=0 // 禁用CGO
  2. SET GOOS=linux // 目标平台是linux
  3. SET GOARCH=amd64 // 目标处理器架构是amd64

如果你的Windows使用的是PowerShell终端,那么设置环境变量的语法为

  1. $ENV:CGO_ENABLED=0
  2. $ENV:GOOS="linux"
  3. $ENV:GOARCH="amd64"

在你的Windows终端下执行完上述命令后,再执行下面的命令,得到的就是能够在Linux平台运行的可执行文件了。

  1. go build

Windows编译Mac可执行文件

Windows下编译Mac平台64位可执行程序:

cmd终端下执行:

  1. SET CGO_ENABLED=0
  2. SET GOOS=darwin
  3. SET GOARCH=amd64
  4. go build

PowerShell终端下执行:

  1. $ENV:CGO_ENABLED=0
  2. $ENV:GOOS="darwin"
  3. $ENV:GOARCH="amd64"
  4. go build

Mac编译Linux可执行文件

Mac电脑编译得到Linux平台64位可执行程序:

  1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

Mac编译Windows可执行文件

Mac电脑编译得到Windows平台64位可执行程序:

  1. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Linux编译Mac可执行文件

Linux平台下编译Mac平台64位可执行程序:

  1. CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build

Linux编译Windows可执行文件

Linux平台下编译Windows平台64位可执行程序:

  1. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
  • 跨平台编译 ```shell CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags ‘-s -w —extldflags “-static -fpic”‘ main.go

GOOS=linux go build -tags release -a -ldflags “-linkmode external -extldflags -static” -o supervisord

  1. CGO_ENABLED 这个参数默认为1,开启CGO。需要指定为0来关闭,因为CGO不支持交叉编译。<br />GOOS GOARCH 用来指定要构建的平台为Linux
  2. ```shell
  3. -s -w 去掉调试信息,可以减小构建后文件体积,
  4. --extldflags "-static -fpic" 完全静态编译[2],这样编译生成的文件就可以任意放到指定平台下运行,而不需要运行环境配置。