[TOC] > [git快速入门指南](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.0.md) ## 安装配置 ### 类linux 配置 go 有4个环境变量需要设置: GOROOT、 GOPATH、 GOBIN,以及PATH 需要设置到某一个 profile文件中(`~/bash_ profile`或`/etc/ profile`) ``` export GOROOT=/usr/local/go export GOBIN=$GOROOT/bin export PATH=$PATH:$GOBIN export GOPATH=/var/opt/wwwroot/goblin ``` 添加到对应的`profile` 配置文件中 eg: `source .zshrc` 或`source .bashrc` ### mac 1. 安装 `brew install go` 2. 如果 goland 编辑器 无法调试 `https://developer.apple.com/download/more/` 下载 `Command Line tools(macoS 10.13) for Xcode 9.1` ## import 用法 ## 出现undefined 错误 设置编辑器用 包的形式编译 或者 指定需要的包 `go run main.go hub.go ` ### `_`(下划线) 用法,初始化 `init` 函数 ``` import ( _ "../show2" //只调用 show2包的 init() 函数 包中的其他方法不可调用 ) ``` ## 工作目录最好是在src 中创建项目 这样自定义包可以编辑器可以识别并导入 ### 制作开源模块需要注意到事情 ``` export GO111MODULE=on mkdir -p src/github.com/idcpj/red_packet cd src/github.com/idcpj/red_packet go mod init github.com/idcpj/red_packet > tree ├── README.md ├── app.go ├── brun │   ├── config.ini │   └── main.go ├── go.mod ├── go.sum ├── infra │   ├── base │   │   ├── dbx.go │   │   ├── log.go │   │   └── props.go │   ├── boot.go ``` 执行自己的模块时候,需要在 `brun/main.go` 中初始化整个模块(存在 `ini()` 函数) main.go ``` _ "github.com/idcpj/red_packet" ``` 在 go.mod 中 添加(编译时,总是 编辑线上 githhub.com 的版本) ``` module github.com/idcpj/red_packet // indirect ``` 执行 ``` cd brun go run main.go ``` ## package 包说明 1. 在同一个目录只能由一个`main`包,即开头为`package main`,不然编译会报错 2. `package` 的包名 最好与目录名相同 eg: test 目录下则包名为`package test` ### 下载项目所有的依赖包 ` go get -d -v ./...` -d标志只下载代码包,不执行安装命令; -v打印详细日志和调试日志。这里加上这个标志会把每个下载的包都打印出来; ./...这个表示路径,代表当前目录下所有的文件。 ### 下载被墙的包 #### 方法一 如需官方包下载`golang.org/x/time/rate` ``` cd $GOPATH/src/golang.rog/x/ git clone http://github.com/golang/time.git time ``` 下载第三方包 ``` cd $GOPATH/src/github.com/go-sql-driver/ git clone https://github.com/go-sql-driver/mysql 如果有些需要执行命令 如goimports go install golang.org/x/tools/cmd/goimports ``` #### 方法二 goproxy 国内源加速 ``` export GO111MODULE=on //必须有 mod export GOPROXY=https://goproxy.cn ``` ##### Go version >= 1.13 `go env -w GOPROXY=https://goproxy.cn` #### 用 mod 的 replace 代替 ``` replace ( golang.org/x/sys => github.com/golang/sys latest ) ``` ### 如何导入自定义包 ``` ├── learn1 │   └── learn1.go ├── show2 │   └── show2.go └── main.go ``` `show2.go` 中内容 ``` package show2 import "fmt" func init() { fmt.Print("my name is show2") } func Show2(){} ``` 导入 包 ``` import ( "./show2" //可使用相对路径 ) //main(函数 func main() { show2.Show2() } ``` ### 变量可见性规则 1. 大写字母开头的变量是可导出的,也就是其它包可以读取的,是公用变量 2. 小写字母开头的就是不可导出的,是私有变量。 ## 常用命令 1. `go build` : 用于编译源码文件、代码包、依赖包 2. `go run` : 可以编译并运行Go源码文件 ``` a : 强制编译相关代码,不论它们的编译结果是否已是最新的 n : 打印编译过程中所需运行的命令,但不真正执行它们 p n: 并行编译,其中n为并行的数量,为cpu 核数 ``` 1. `go get -v` : 命令主要是用来动态获取远程代码包的 eg: `go get -v http://xxxxx/test.go` 注意: `go get` 下载的文件是放在 `GOPATH`中 可通过 `go env | grep GOPATH` 查看 可在`goLand`中设置全局和项目的的 `GOPATH` ``` -d : 只执行下载动作,而不执行安装动作 -fix : 在下载代码包后先执行修正动作,而后再进行编译和安装 -u : 利用网络来更新已有的代码包及其依赖包 ``` 1. `go install ./模块名` 或模块下 `go install main.go` 可编译出一个存在 src同级的 bin 目录下的执行命令 ## 初始化模块的函数 `init` 如某个目录下有 多个`*.go` 文件, 在引入`xxx/model` 时 每个文件的 `func init()` 都会执行 ## 程序从后台运行,不出现dos窗口 `go build -ldflags "-H windowsgui` 文件为当前目录对应的文件 ## 在不同平台编译指定文件 Mac 下编译 Linux 和 Windows 64位可执行程序 ``` CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go ``` Linux 下编译 Mac 和 Windows 64位可执行程序 ``` CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go ``` Windows 下编译 Mac 和 Linux 64位可执行程序 ``` SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go ``` ``` GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) GOARCH:目标平台的体系架构(386、amd64、arm) ``` ### 自动编译linux 和window 的多个文件 ``` SET GOOS=linux go build antbiz.go cd proxy go build antzoo.go cd ../ SET GOOS=windows go build antbiz.go cd proxy go build antzoo.go cd ../ ```