• protobuf的使用


    先上官方使用文档 https://developers.google.cn/protocol-buffers/docs/proto3

    • 定义proto文件
    syntax = "proto3";
    
    //.表示生成的go文件存放到当前目录下 student表示文件的包名为student option go_package=".;student";

    //定义枚举类型 enum Sex{ man = 0; woman = 2; } message Person { string name = 1; //定义枚举类型 Sex sex = 2; } message Student { int32 score = 1; //嵌套类型 Person p = 2; //切片数组定义 repeated string like = 3; } message StuReq { int32 id = 1; } service stuService{ rpc GetInfo(StuReq) returns (Student); }
    • 执行生成go文件命令

    不带注册服务的编译

    protoc --go_out=./ *.proto

    带注册服务的编译(只适用在grpc中)

    protoc --go_out=plugins=grpc:./ *.proto

      其中 --go_out 表示输出目录,生成文件如下

    // Code generated by protoc-gen-go. DO NOT EDIT.
    // versions:
    // 	protoc-gen-go v1.25.0
    // 	protoc        v3.15.5
    // source: student.proto
    
    package student
    
    import (
    	context "context"
    	proto "github.com/golang/protobuf/proto"
    	grpc "google.golang.org/grpc"
    	codes "google.golang.org/grpc/codes"
    	status "google.golang.org/grpc/status"
    	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
    	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
    	reflect "reflect"
    	sync "sync"
    )
    
    const (
    	// Verify that this generated code is sufficiently up-to-date.
    	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
    	// Verify that runtime/protoimpl is sufficiently up-to-date.
    	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
    )
    
    // This is a compile-time assertion that a sufficiently up-to-date version
    // of the legacy proto package is being used.
    const _ = proto.ProtoPackageIsVersion4
    
    type Sex int32
    
    const (
    	Sex_man   Sex = 0
    	Sex_woman Sex = 2
    )
    
    // Enum value maps for Sex.
    var (
    	Sex_name = map[int32]string{
    		0: "man",
    		2: "woman",
    	}
    	Sex_value = map[string]int32{
    		"man":   0,
    		"woman": 2,
    	}
    )
    
    func (x Sex) Enum() *Sex {
    	p := new(Sex)
    	*p = x
    	return p
    }
    
    func (x Sex) String() string {
    	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
    }
    
    func (Sex) Descriptor() protoreflect.EnumDescriptor {
    	return file_student_proto_enumTypes[0].Descriptor()
    }
    
    func (Sex) Type() protoreflect.EnumType {
    	return &file_student_proto_enumTypes[0]
    }
    
    func (x Sex) Number() protoreflect.EnumNumber {
    	return protoreflect.EnumNumber(x)
    }
    
    // Deprecated: Use Sex.Descriptor instead.
    func (Sex) EnumDescriptor() ([]byte, []int) {
    	return file_student_proto_rawDescGZIP(), []int{0}
    }
    
    type Person struct {
    	state         protoimpl.MessageState
    	sizeCache     protoimpl.SizeCache
    	unknownFields protoimpl.UnknownFields
    
    	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
    	//定义枚举类型
    	Sex Sex `protobuf:"varint,2,opt,name=sex,proto3,enum=Sex" json:"sex,omitempty"`
    }
    
    func (x *Person) Reset() {
    	*x = Person{}
    	if protoimpl.UnsafeEnabled {
    		mi := &file_student_proto_msgTypes[0]
    		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
    		ms.StoreMessageInfo(mi)
    	}
    }
    
    func (x *Person) String() string {
    	return protoimpl.X.MessageStringOf(x)
    }
    
    func (*Person) ProtoMessage() {}
    
    func (x *Person) ProtoReflect() protoreflect.Message {
    	mi := &file_student_proto_msgTypes[0]
    	if protoimpl.UnsafeEnabled && x != nil {
    		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
    		if ms.LoadMessageInfo() == nil {
    			ms.StoreMessageInfo(mi)
    		}
    		return ms
    	}
    	return mi.MessageOf(x)
    }
    
    // Deprecated: Use Person.ProtoReflect.Descriptor instead.
    func (*Person) Descriptor() ([]byte, []int) {
    	return file_student_proto_rawDescGZIP(), []int{0}
    }
    
    func (x *Person) GetName() string {
    	if x != nil {
    		return x.Name
    	}
    	return ""
    }
    
    func (x *Person) GetSex() Sex {
    	if x != nil {
    		return x.Sex
    	}
    	return Sex_man
    }
    
    type Student struct {
    	state         protoimpl.MessageState
    	sizeCache     protoimpl.SizeCache
    	unknownFields protoimpl.UnknownFields
    
    	Score int32 `protobuf:"varint,1,opt,name=score,proto3" json:"score,omitempty"`
    	//嵌套类型
    	P *Person `protobuf:"bytes,2,opt,name=p,proto3" json:"p,omitempty"`
    	//切片数组定义
    	Like []string `protobuf:"bytes,3,rep,name=like,proto3" json:"like,omitempty"`
    }
    
    func (x *Student) Reset() {
    	*x = Student{}
    	if protoimpl.UnsafeEnabled {
    		mi := &file_student_proto_msgTypes[1]
    		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
    		ms.StoreMessageInfo(mi)
    	}
    }
    
    func (x *Student) String() string {
    	return protoimpl.X.MessageStringOf(x)
    }
    
    func (*Student) ProtoMessage() {}
    
    func (x *Student) ProtoReflect() protoreflect.Message {
    	mi := &file_student_proto_msgTypes[1]
    	if protoimpl.UnsafeEnabled && x != nil {
    		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
    		if ms.LoadMessageInfo() == nil {
    			ms.StoreMessageInfo(mi)
    		}
    		return ms
    	}
    	return mi.MessageOf(x)
    }
    
    // Deprecated: Use Student.ProtoReflect.Descriptor instead.
    func (*Student) Descriptor() ([]byte, []int) {
    	return file_student_proto_rawDescGZIP(), []int{1}
    }
    
    func (x *Student) GetScore() int32 {
    	if x != nil {
    		return x.Score
    	}
    	return 0
    }
    
    func (x *Student) GetP() *Person {
    	if x != nil {
    		return x.P
    	}
    	return nil
    }
    
    func (x *Student) GetLike() []string {
    	if x != nil {
    		return x.Like
    	}
    	return nil
    }
    
    type StuReq struct {
    	state         protoimpl.MessageState
    	sizeCache     protoimpl.SizeCache
    	unknownFields protoimpl.UnknownFields
    
    	Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
    }
    
    func (x *StuReq) Reset() {
    	*x = StuReq{}
    	if protoimpl.UnsafeEnabled {
    		mi := &file_student_proto_msgTypes[2]
    		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
    		ms.StoreMessageInfo(mi)
    	}
    }
    
    func (x *StuReq) String() string {
    	return protoimpl.X.MessageStringOf(x)
    }
    
    func (*StuReq) ProtoMessage() {}
    
    func (x *StuReq) ProtoReflect() protoreflect.Message {
    	mi := &file_student_proto_msgTypes[2]
    	if protoimpl.UnsafeEnabled && x != nil {
    		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
    		if ms.LoadMessageInfo() == nil {
    			ms.StoreMessageInfo(mi)
    		}
    		return ms
    	}
    	return mi.MessageOf(x)
    }
    
    // Deprecated: Use StuReq.ProtoReflect.Descriptor instead.
    func (*StuReq) Descriptor() ([]byte, []int) {
    	return file_student_proto_rawDescGZIP(), []int{2}
    }
    
    func (x *StuReq) GetId() int32 {
    	if x != nil {
    		return x.Id
    	}
    	return 0
    }
    
    var File_student_proto protoreflect.FileDescriptor
    
    var file_student_proto_rawDesc = []byte{
    	0x0a, 0x0d, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
    	0x34, 0x0a, 0x06, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
    	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a,
    	0x03, 0x73, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x04, 0x2e, 0x53, 0x65, 0x78,
    	0x52, 0x03, 0x73, 0x65, 0x78, 0x22, 0x4a, 0x0a, 0x07, 0x53, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74,
    	0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
    	0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x15, 0x0a, 0x01, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28,
    	0x0b, 0x32, 0x07, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x01, 0x70, 0x12, 0x12, 0x0a,
    	0x04, 0x6c, 0x69, 0x6b, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6b,
    	0x65, 0x22, 0x18, 0x0a, 0x06, 0x53, 0x74, 0x75, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69,
    	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x2a, 0x19, 0x0a, 0x03, 0x53,
    	0x65, 0x78, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x77,
    	0x6f, 0x6d, 0x61, 0x6e, 0x10, 0x02, 0x32, 0x2a, 0x0a, 0x0a, 0x73, 0x74, 0x75, 0x53, 0x65, 0x72,
    	0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12,
    	0x07, 0x2e, 0x53, 0x74, 0x75, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x53, 0x74, 0x75, 0x64, 0x65,
    	0x6e, 0x74, 0x42, 0x0b, 0x5a, 0x09, 0x2e, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x62,
    	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
    }
    
    var (
    	file_student_proto_rawDescOnce sync.Once
    	file_student_proto_rawDescData = file_student_proto_rawDesc
    )
    
    func file_student_proto_rawDescGZIP() []byte {
    	file_student_proto_rawDescOnce.Do(func() {
    		file_student_proto_rawDescData = protoimpl.X.CompressGZIP(file_student_proto_rawDescData)
    	})
    	return file_student_proto_rawDescData
    }
    
    var file_student_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
    var file_student_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
    var file_student_proto_goTypes = []interface{}{
    	(Sex)(0),        // 0: Sex
    	(*Person)(nil),  // 1: Person
    	(*Student)(nil), // 2: Student
    	(*StuReq)(nil),  // 3: StuReq
    }
    var file_student_proto_depIdxs = []int32{
    	0, // 0: Person.sex:type_name -> Sex
    	1, // 1: Student.p:type_name -> Person
    	3, // 2: stuService.GetInfo:input_type -> StuReq
    	2, // 3: stuService.GetInfo:output_type -> Student
    	3, // [3:4] is the sub-list for method output_type
    	2, // [2:3] is the sub-list for method input_type
    	2, // [2:2] is the sub-list for extension type_name
    	2, // [2:2] is the sub-list for extension extendee
    	0, // [0:2] is the sub-list for field type_name
    }
    
    func init() { file_student_proto_init() }
    func file_student_proto_init() {
    	if File_student_proto != nil {
    		return
    	}
    	if !protoimpl.UnsafeEnabled {
    		file_student_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
    			switch v := v.(*Person); i {
    			case 0:
    				return &v.state
    			case 1:
    				return &v.sizeCache
    			case 2:
    				return &v.unknownFields
    			default:
    				return nil
    			}
    		}
    		file_student_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
    			switch v := v.(*Student); i {
    			case 0:
    				return &v.state
    			case 1:
    				return &v.sizeCache
    			case 2:
    				return &v.unknownFields
    			default:
    				return nil
    			}
    		}
    		file_student_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
    			switch v := v.(*StuReq); i {
    			case 0:
    				return &v.state
    			case 1:
    				return &v.sizeCache
    			case 2:
    				return &v.unknownFields
    			default:
    				return nil
    			}
    		}
    	}
    	type x struct{}
    	out := protoimpl.TypeBuilder{
    		File: protoimpl.DescBuilder{
    			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
    			RawDescriptor: file_student_proto_rawDesc,
    			NumEnums:      1,
    			NumMessages:   3,
    			NumExtensions: 0,
    			NumServices:   1,
    		},
    		GoTypes:           file_student_proto_goTypes,
    		DependencyIndexes: file_student_proto_depIdxs,
    		EnumInfos:         file_student_proto_enumTypes,
    		MessageInfos:      file_student_proto_msgTypes,
    	}.Build()
    	File_student_proto = out.File
    	file_student_proto_rawDesc = nil
    	file_student_proto_goTypes = nil
    	file_student_proto_depIdxs = nil
    }
    
    // Reference imports to suppress errors if they are not otherwise used.
    var _ context.Context
    var _ grpc.ClientConnInterface
    
    // This is a compile-time assertion to ensure that this generated file
    // is compatible with the grpc package it is being compiled against.
    const _ = grpc.SupportPackageIsVersion6
    
    // StuServiceClient is the client API for StuService service.
    //
    // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
    type StuServiceClient interface {
    	GetInfo(ctx context.Context, in *StuReq, opts ...grpc.CallOption) (*Student, error)
    }
    
    type stuServiceClient struct {
    	cc grpc.ClientConnInterface
    }
    
    func NewStuServiceClient(cc grpc.ClientConnInterface) StuServiceClient {
    	return &stuServiceClient{cc}
    }
    
    func (c *stuServiceClient) GetInfo(ctx context.Context, in *StuReq, opts ...grpc.CallOption) (*Student, error) {
    	out := new(Student)
    	err := c.cc.Invoke(ctx, "/stuService/GetInfo", in, out, opts...)
    	if err != nil {
    		return nil, err
    	}
    	return out, nil
    }
    
    // StuServiceServer is the server API for StuService service.
    type StuServiceServer interface {
    	GetInfo(context.Context, *StuReq) (*Student, error)
    }
    
    // UnimplementedStuServiceServer can be embedded to have forward compatible implementations.
    type UnimplementedStuServiceServer struct {
    }
    
    func (*UnimplementedStuServiceServer) GetInfo(context.Context, *StuReq) (*Student, error) {
    	return nil, status.Errorf(codes.Unimplemented, "method GetInfo not implemented")
    }
    
    func RegisterStuServiceServer(s *grpc.Server, srv StuServiceServer) {
    	s.RegisterService(&_StuService_serviceDesc, srv)
    }
    
    func _StuService_GetInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
    	in := new(StuReq)
    	if err := dec(in); err != nil {
    		return nil, err
    	}
    	if interceptor == nil {
    		return srv.(StuServiceServer).GetInfo(ctx, in)
    	}
    	info := &grpc.UnaryServerInfo{
    		Server:     srv,
    		FullMethod: "/stuService/GetInfo",
    	}
    	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
    		return srv.(StuServiceServer).GetInfo(ctx, req.(*StuReq))
    	}
    	return interceptor(ctx, in, info, handler)
    }
    
    var _StuService_serviceDesc = grpc.ServiceDesc{
    	ServiceName: "stuService",
    	HandlerType: (*StuServiceServer)(nil),
    	Methods: []grpc.MethodDesc{
    		{
    			MethodName: "GetInfo",
    			Handler:    _StuService_GetInfo_Handler,
    		},
    	},
    	Streams:  []grpc.StreamDesc{},
    	Metadata: "student.proto",
    }
    

      

  • 相关阅读:
    atitit.无为而治在企业管理,国家治理,教育领域的具体思想与实践
    atitit.浏览器web gui操作类库 和 操作chrome浏览器的类库使用总结
    atitit.loading的设计与实现控件选型attilax 总结
    atitit.系统托盘图标的设计java swing c# .net c++ js
    atitit.流程标准化 mysql启动不起来的排查流程attilax总结
    atitit.图片相似度与图片查找的设计 获取图片指纹
    atitit.it企业管理 项目管理 中的 授权机制 的来源 君权神授 的一定合理性
    atitit..国富论 在现代it企业项目管理中的作用attialx 总结国富论读后感 attialx
    atitit.印度教与java宗教的特点与观念对比 attilax总结
    atitit.验证码识别step2剪贴板ClipBoard copy image图像 attilax总结
  • 原文地址:https://www.cnblogs.com/itsuibi/p/14726558.html
Copyright © 2020-2023  润新知