我是靠谱客的博主 称心高跟鞋,最近开发中收集的这篇文章主要介绍Golang proto 类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

        • 前言
        • 嵌套 message
        • 枚举
        • map类型
        • 内置的时间类型
        • 数组

前言

常见的基本类型就不讲了

嵌套 message

通常我们使用的都是单层message,多层的message要通过"."拼接(如:A.B)
多层使用时使用“_”拼接(如:A_B)
多层嵌套的好处在哪里呢?我认为,我明确的知道B是属于A的。除了A其它的不应该去使用它
//定义
syntax = "proto3";
option go_package = "Study/Seven/D;Dbp";

message A {
  message B {
    string data = 1;
  }
}

service http {
  rpc ping(A.B) returns (A.B);
}
//使用
package main

import (
	Dbp "Study/Seven/D"
	"context"
	"google.golang.org/grpc"
	"net"
)

type Service struct{}

func (s *Service) Ping(ctx context.Context, b *Dbp.A_B) (*Dbp.A_B, error) {
	//TODO implement me
	panic("implement me")
}

func main() {
	server := grpc.NewServer()
	Dbp.RegisterHttpServer(server, &Service{})
	listen, _ := net.Listen("tpc", ":8083")
	server.Serve(listen)
}

枚举

第一个值必须是0开始,只支持int,从生成的代码中看到生成的类型是int32
//定义
syntax = "proto3";
option go_package = "Study/Seven/D;Dbp";

enum A {
   v1 = 0;
   V2 = 1;
   v3 = 4;
}
//使用
package main

import (
	Dbp "Study/Seven/D"
	"fmt"
)

func main() {
	fmt.Println(Dbp.A_v1)
}

map类型

定义中使用map<type,type> 生成的代码对应 map[type]type
map<string,string> 对应 map[string]string
//定义
syntax = "proto3";
option go_package = "Study/Seven/D;Dbp";

message Request {
  map<string, string> data = 1;
}
//使用
package main

import (
	Dbp "Study/Seven/D"
	"fmt"
)

func main() {
	req := Dbp.Request{
		Data: map[string]string{
			"a": "b",
		},
	}

	fmt.Println(req.Data)
}

内置的时间类型

定义: import "google/protobuf/timestamp.proto"后再定义
使用: import google.golang.org/protobuf/types/known/timestamppb
内置的时间类型是在time.TIME上进行封装的,能够相互转换,非常方便
//定义
syntax = "proto3";
import "google/protobuf/timestamp.proto";
option go_package = "Study/Seven/D;Dbp";

message Request {
google.protobuf.Timestamp Current = 1;
}
//使用
package main

import (
	Dbp "Study/Seven/D"
	"fmt"
	"google.golang.org/protobuf/types/known/timestamppb"
	"time"
)

func main() {
	req := Dbp.Request{
		Current: timestamppb.New(time.Now()),
	}

	fmt.Println(req.Current.AsTime().In(time.Local).Format("2006-01-02 15:04:05")) //2022-12-18 02:05:06
	fmt.Println(time.Now().Format("2006-01-02 15:04:05"))                          //2022-12-18 02:05:06
}

数组

常规定义前加上 repeated,即代表数组
//定义
syntax = "proto3";
import "google/protobuf/timestamp.proto";
option go_package = "Study/Seven/D;Dbp";

message Request {
  repeated string Data = 1;
}
//使用
package main

import (
	Dbp "Study/Seven/D"
	"fmt"
)

func main() {
	request := Dbp.Request{
		Data: []string{"a", "b", "c"},
	}
	fmt.Println(request.Data) //[a b c]
}

最后

以上就是称心高跟鞋为你收集整理的Golang proto 类型的全部内容,希望文章能够帮你解决Golang proto 类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(93)

评论列表共有 0 条评论

立即
投稿
返回
顶部