超人黄爸爸 發表於 2022-8-20 16:55:00

go protoc-gen-go 安装详解

<p>首先是安装官方的protoc工具,可以从其GitHub官方网站下载</p>
<p>https://github.com/protocolbuffers/protobuf/releases</p>
<p>我下载的win-64版本</p>
<p><img src="https://img2022.cnblogs.com/blog/858199/202208/858199-20220820183251766-1877436830.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>下载完成后解压把bin下面的protoc.exe 拷贝到GOPATH下面</p>
<p><img src="https://img2022.cnblogs.com/blog/858199/202208/858199-20220820183448582-1430024018.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>然后是安装针对Go语言的代码生成插件<br><span style="font-family: &quot;Courier New&quot;; font-size: 12px; background-color: rgba(248, 248, 248, 1)">go getgithub.com/golang/protobuf/protoc-gen-go</span></p>
<p>  </p>
<p>报错如下错误</p>
<p><img src="https://img2022.cnblogs.com/blog/858199/202208/858199-20220820165026519-2105735864.png"></p>
<p>&nbsp;&nbsp;</p>
<p>我使用的go版本是1.17。而Go1.17版使用go install安装依赖。所以应该按照它下面的格式go install pkg@version进行拉取,同时按照提示原来的地址作废需要<br>替换成google.golang.org/protobuf,最终命令为:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
</pre>
</div>
<p>  </p>
<p>本地先创建了一个hello.proto</p>
<div class="cnblogs_Highlighter">
<pre class="brush:go;gutter:true;">syntax = "proto3";

package main;

message String {
string value = 1;
}
</pre>
</div>
<p>  </p>
<p>然后通过以下命令生成相应的Go代码</p>
<div class="cnblogs_Highlighter">
<pre class="brush:go;gutter:true;">protoc --go_out=. hello.proto
</pre>
</div>
<p>其中go_out参数告知protoc编译器去加载对应的protoc-gen-go工具,然后通过该工具生成代码放到当前目录。最后是一系列要处理的Protobuf文件的列表</p>
<p>&nbsp;</p>
<p>如果出现下图问题,检查一下环境变量</p>
<p><img src="https://img2022.cnblogs.com/blog/858199/202208/858199-20220820170042854-1299769611.png"></p>
<p>&nbsp;</p>
<p>错误:</p>
<p><img src="https://img2022.cnblogs.com/blog/858199/202208/858199-20220820185936410-1349656437.png"></p>
<p>&nbsp;</p>
<p>提示需要&nbsp; option go_package=<span class="hljs-string">"./;main";</span></p>
<p><span class="hljs-string">go_package 是指生成的文件要放哪里,main指生成的文件包名是什么</span></p>
<p><span class="hljs-string"><img src="https://img2022.cnblogs.com/blog/858199/202208/858199-20220820190200692-764862160.png"></span></p>
<p>&nbsp;</p>
<p>最终生成的文件:</p>
<p><img src="https://img2022.cnblogs.com/blog/858199/202208/858199-20220820190245825-1360360907.png"></p>
<p>&nbsp;<em id="__mceDel">生成的结构体中还会包含一些以XXX_为名字前缀的成员,我们已经隐藏了这些成员。同时String类型还自动生成了一组方法,</em></p>
<p><em id="__mceDel">其中ProtoMessage()方法表示这是一个实现了proto.Message接口的方法。此外,Protobuf还为每个成员生成了一个Get方法,</em></p>
<p><em id="__mceDel">Get方法不仅可以处理空指针类型,而且可以和Protobuf第2版的方法保持一致(第二版的自定义默认值特性依赖这类方法)</em></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/shiding/p/16608117.html
頁: [1]
查看完整版本: go protoc-gen-go 安装详解