前言
常见的基本类型就不讲了
嵌套 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) {
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"))
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
}
数组
常规定义前加上 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)
}