之前我们分享了Google Protobuf的相关介绍以及基本数据类型以及在PHP框架laravel中如何使用protobuf,本篇文章就简单介绍下如何在Golang中使用protobuf。

1、安装配置protobuf环境:

在上一篇中我们已经配置好了protobuf环境,这里不再重复配置了。

2、获取 goprotobuf 提供的 Protobuf 编译器插件 protoc-gen-go:

此插件被 protoc 使用,用于编译 .proto 文件为 Golang 源文件,通过此源文件可以使用定义在 .proto 文件中的消息。

go get github.com/golang/protobuf/protoc-gen-go
cd github.com/golang/protobuf/protoc-gen-go
go build
go install
vi /etc/profile 将$GOPATH/bin 加入环境变量
source profile

安装完成后加入对应的环境变量中。

3、获取 goprotobuf 提供的支持库,包含诸如编码(marshaling)、解码(unmarshaling)等功能:

go get github.com/golang/protobuf/proto
cd github.com/golang/protobuf/proto
go build
go install

4、在Golang项目中建立相应的目录结构,然后执行命令解析proto生成对应的文件:

执行命令如下:

protoc --go_out="protobuf/compile" "protobuf/protos/comment.proto"

5、在Golang项目中编写测试代码:

var protobuf_url = "http://127.0.0.1:1232/protobuf"

func NewComment(c echo.Context) error {
        com := &Comment{
                Id:        *proto.Int32(2),
                Text:      *proto.String("This is golang protobuf example!"),
                CreatedAt: *proto.String(time.Now().Format("2006-01-02 15:04:05")),
        }

        content, _ := proto.Marshal(com)
        req, _ := http.NewRequest("POST", protobuf_url, bytes.NewReader(content))
        resp, _ := http.DefaultClient.Do(req)

        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        if err != nil {
                fmt.Println(err)
        }

        var rs Comment
        json.Unmarshal(body, &rs)
        return c.JSON(http.StatusOK, rs)
}

func GetComment(c echo.Context) error {
        com := &Comment{}
        body, _ := ioutil.ReadAll(c.Request().Body)
        proto.Unmarshal(body, com)
        return c.JSON(http.StatusOK, com)
}

配置好相关的路由,然后在浏览器中执行即可查看返回结果。 comment.proto文件内容如下:

syntax = "proto3";

package protos;
message Comment {
        int32 id = 1;
        string text = 2;
        string created_at = 3;
}

results matching ""

    No results matching ""