Golang proto 类型

前言
常见的基本类型就不讲了
嵌套 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]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值