win11、wsl2 ubuntu 22.04下go开发
安装go 1.19.3
1.下载源码包、解压
tar zxvf go1.19.3.linux-amd64.tar.gz
cp -r ./go /home/chq/soft
2.设置工作目录
mkdir /home/chq/go
mkdir /home/chq/projects
3.配置变量
export GOROOT=/home/chq/soft/go
export GOPATH=/home/chq/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOPROXY="https://goproxy.io,direct"
source ~/.zshrc
4.vscode 下载Remote - WSL拓展
在启动的wsl虚拟机内,输入
code .
启动vscode,就可以管理wsl2 内go环境和vscode通信了
安装protoc与protoc-gen-go(待完善)
Protobuf(Protocol Buffer)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。(也就是说,当服务器端使用go实现,注册了api;那么客户端是python实现,通过Protobuf也可以实现远程访问)
- protoc是Protobuf编译器,可以从github上直接下载源码,下载地址:https://github.com/protocolbuffers/protobuf/tags
这里选择protoc-3.7.1-linux-x86_64.zip,可以直接解压到/usr/local/目录下,执行一下命令:
$ unzip protoc-3.7.1-linux-x86_64.zip -d /usr/local/
之后,/usr/local/bin 下面就会出现protoc
$ protoc --version
libprotoc 3.7.1
- protoc-gen-go是go版本的Protobuf编译器插件,能访问网络的情况下,只需要在某个项目下运行
执行命令,便可以在$GOPATH/bin目录下发现这个工具
go install github.com/golang/protobuf/protoc-gen-go@latest
当Linux系统无法访问网络时:首先在github.com/golang/protobuf上下载protoc-gen-go和proto,(最好将其放在$GOPATH/src目录下)然后进入protoc-gen-go目录,执行go build、go install即可在$GOPATH/bin目录下发现这个工具。前提是必须首先将$GOPATH/bin路径添加到环境变量$PATH中。
测试
- 创建项目
mkdir go-demo
go mod init go-demo
- 编写test.proto文件
// 指定版本
syntax = "proto3";
// 包名
package pb;
指定包名的位置改成:
option go_package = "./pb";
// 课程
message Course{
int32 id = 1;
string name = 2;
}
// 学生
message Student{
int32 id = 1;
string name = 2;
repeated Course courses = 3;
}
生成文件命令:protoc --go_out=. test.proto , 编写main文件
报错:
➜ go-demo protoc --go_out=. test.proto
protoc-gen-go: unable to determine Go import path for "test.proto"
Please specify either:
• a "go_package" option in the .proto source file, or
• a "M" argument on the command line.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
--go_out: protoc-gen-go: Plugin failed with status code 1.
修改test.proto文件,原因是protoc-gen-go版本过高,对源proto文件需要添加包名,在包名后添加一行:
指定包名的位置改成:
option go_package = "./pb";
之后重新执行命令: protoc --go_out=. test.proto