一、配置 Go 1.18 开发环境
1. install golang by brew
$ brew install go
2. set Path for Go
# .zshrc
# go
export GOROOT=/opt/homebrew/Cellar/go/1.18/libexec
export GOPATH=$HOME/workspace/project/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOPROXY=https://goproxy.cn,direct
export GOPRIVATE=XXX(具体的私有库,可根据自己的配置来定)
注意,低版本 Go 不支持 GOPROXY 中带逗号。
3. view go version
$ go version
go version go1.18 darwin/arm64
对于有些早期项目使用较低 Go 版本构建,使用「1.18」版本编译通不过,
注意,安装 Go 尽量安装团队统一在用的版本,安装过高或过低版本,可能有些地方不支持会产生许多报错。
这时需要支持 Go 多版本切换,安装「1.16」版本。
$ brew search go
$ brew unlink go
$ brew install go@1.16
$ brew link go@1.16
$ go version
go version go1.16.15 darwin/arm64
切换版本,也得切换对应的环境变量
export GOROOT=/opt/homebrew/Cellar/go@1.16/1.16.15/libexec
如果不使用 brew,也可从 https://golang.org/dl/ 选择合适版本,
下载完后,go version 可查看 go 版本,如有显示版本代表安装成功,
go env 查看 go 环境变量。
二、IDE 使用 VSCode
VSCode 中安装 Go 的扩展,让它支持 Go 语言开发
填坑记录
Go 插件一般可以直接安装成功,如果幸运的话,需要填一下这个坑。
Failed to find the "go" binary in either。GOROOT() or PATH(/usr/bin:/bin:/usr/sbin:/sbin). Check PATH, or Install Go and reload the window.
- Shift + Cmd + P
- Search for: "open settings" and choose "Open Settings (JSON)"
- Run
go env
and copy GOROOT value (in my case it's /opt/homebrew/Cellar/go@1.17/1.17.11/libexec).- Add new record to settings.json:
"go.goroot": "Copied/GOROOT/path"
In my case,
"go.gopath": "/Users/shouyuan.man/workspace/project/go", "go.goroot": "/opt/homebrew/Cellar/go@1.17/1.17.11/libexec"
就算是设置成上面这样,也会有一个问题,运行 go env GOVERSION,VSCode 终端和操作系统终端的显示不一样。
最后确认这个问题,是因为拿到的 MAC 机有两个账号,另外一个账号下有安装 Go 1.18.3 版本,本账号下安装的是 Go 1.17.11,导致在本账号下运行 go env 命令,VSCode 终端和操作系统终端的显示不一样,比如 VSCode 终端显示1.18,os终端显示1.17(由于配置了环境变量)。解决办法:把新设置的环境变量放在 $PATH 之前,这样可以保证先从前面开始定位。
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
安装 Go 语言开发工具包,支持提供诸如代码提示、代码自动补全等功能
如果代码中使用了「golangci-lint、goimports、mockgen、modvendor」,则用下面命令安装。
$ GO111MODULE=off go get install github.com/goware/modvendor
$ GO111MODULE=off go get github.com/golang/mock/gomock
$ go install github.com/golang/mock/gomock
$ GO111MODULE=off go get github.com/golang/mock/mockgen
$ go install github.com/golang/mock/mockgen
$ GO111MODULE=off go get golang.org/x/tools/cmd/goimports
$ go install golang.org/x/tools/cmd/goimports
$ brew install golangci-lint
最后安装的 GO 开发辅助工具放在 bin 中
填坑
设置了 GOPROXY 代理,还是出现 i/o timeout,
Get \"https://proxy.golang.org/github.com/cweill/gotests/gotests/@v/list\": dial tcp 172.217.160.113:443: i/o timeout
问题:设置了GOPROXY还是出现i/o timeout · Issue #93 · goproxy/goproxy.cn · GitHub
解决VSCode安装Go tools失败的问题 | L2M2
后来发现,还得设置 GO111MODULE="on"。
如果代码库还是拉不下来,那就看看代码库的权限吧。
VSCode Go 代码不能正常跳转,有时是因为依赖代码不同步造成的,可以执行 go mod vendor后,再试试。包括如果 grpccurl 请求出现问题,可能是由于 proto 文件内容版本不一致,需同步 proto 文件。
三、RPC相关
常用的 RPC 框架有两种,一种是「仅提供 RPC 调用能力」,如 grpc、Thrift 等, grpc 依赖了 Protocol Buffers(PB);另一种是「除了提供基本的RPC调用能力,还承载了各种服务治理功能」,如Dubbo、Motan、Spring Cloud等,与其说spring cloud是一个RPC框架,还不如说它是一个分布式系统解决方案,生态非常庞大。
如果仅仅是使用 RPC 调用功能,第一种 RPC 就能满足需要,要在 Go 项目中使用grpc、thrift,至少需要安装以下环境。
proto(proto>=3.5.0)
2. unzip
unzip protoc-3.5.0-osx-x86_64.zip -d protoc-3.5.0-osx-x86_643. mv
mv protoc-3.5.0-osx-x86_64/bin/protoc /usr/local/bin/protoc4. validate
protoc --version
protoc-gen-go(protoc-gen-go==v1.3.2)
cd $GOPATH
mkdir -p src/github.com/golang
cd src/github.com/golang
wget https://github.com/golang/protobuf/archive/v1.3.2.zip
unzip v1.3.2.zip
mv protobuf-1.3.2 protobuf
cd protobuf
go install github.com/golang/protobuf/protoc-gen-go
如果使用Kratos,需要配置 Kratos GRPC 框架开发环境
1.安装 kratos
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest && kratos upgrade
2.安装 protoc
unzip protoc-3.17.3-osx-x86_64.zip -d protoc-3.17.3-osx-x86_64
mv protoc-3.17.3-osx-x86_64/bin/protoc /usr/local/bin/protoc
protoc --version
mv protoc-3.17.3-osx-x86_64/include/google/ /usr/local/include/
3.安装 protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
4.安装 protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
查看 kratos 版本
$ kratos -v
kratos version v2.3.1
一般安装 protoc-gen-go 和 protoc-gen-go-grpc 就能满足大部分需求,其实如果有现成的服务,运行 kratos run 命令,会自动 download 安装以上的插件。
Run Kratos Deamon and Test
需切换到项目目录下才能执行下面的命令得到正确的结果。
$ kratos run
INFO msg=config loaded: config.yaml format: yaml
INFO msg=[gRPC] server listening on: [::]:9090
INFO msg=[HTTP] server listening on: [::]:8080$ grpcurl \
-plaintext \
-import-path ./api/helloworld \
-proto demo.proto \
-d '{"userID":"xxxxxx"}' \
127.0.0.1:9090 proto.RpcSevice.GetUserByID如果得到下面类似的结果,证明环境配置成功了。
{
"user": {
"userID": "xxxxxx",
"nick": "xxxxx",
"avatar": "https://app.image.cn/xxxx",
"birthday": "1899-12-31T15:54:17Z",
"gender": 1,
"region": [
"中国"
],
"createTime": "2021-10-28T02:31:24Z",
"updateTime": "2022-01-29T09:16:15Z"
}
}
Kratos 使用
- 官方文档:Kratos
- 目录Layout:https://github.com/go-kratos/kratos-layout
- 单一发布项仓库案例:https://github.com/go-kratos/kratos/tree/main/examples/blog
- Mono-Repo案例:https://github.com/go-kratos/beer-shop
Kratos 常用命令
- 添加proto文件:kratos proto add api/helloworld/demo.proto
- 生成proto代码:kratos proto client api/helloworld/demo.proto
- 生成service代码:kratos proto server api/helloworld/demo.proto -t internal/service
- 项目运行:kratos run
执行 kratos proto client 生成的 .pb 文件中字段会默认添加 omitempty 标签,该标签会导致如 0,false等字段值被忽略,前端在进行判断时会出问题。
解决方式一:直接 Control + R 全局替换
解决方式二:protobuf导出golang,调整默认tag的方法 - Go语言中文网 - Golang中文社区
目前倾向于解决方式一,高效快速,后续后更好的方案补充说明。
thrift 安装
brew install thrift@0.9
echo 'export PATH="/usr/local/opt/thrift@0.9/bin:$PATH"' >> ~/.bashrc
Go Dev 网站
一个学 Go 的中文社区
Have Fun