一、route_guide.proto文件
主要内容在注释部分
// proto 语法版本
syntax = "proto3";
// 生成的 go 包路径,最后路径为包名
option go_package = "google.golang.org/grpc/examples/route_guide/routeguide";
// java 相关选项
option java_multiple_files = true;
option java_package = "io.grpc.examples.routeguide";
option java_outer_classname = "RouteGuideProto";
// 包名
package routeguide;
// 服务接口定义
service RouteGuide {
// 双端一元式
rpc GetFeature(Point) returns (Feature) {}
// 服务端流式
rpc ListFeatures(Rectangle) returns (stream Feature) {}
// 客户端流式
rpc RecordRoute(stream Point) returns (RouteSummary) {}
// 双端双流式
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
}
// 消息定义
message Point {
// 类型、名称、序号
int32 latitude = 1;
int32 longitude = 2;
}
message Rectangle {
// 消息嵌套
Point lo = 1;
Point hi = 2;
}
message Feature {
string name = 1;
Point location = 2;
}
message RouteNote {
Point location = 1;
string message = 2;
}
message RouteSummary {
int32 point_count = 1;
int32 feature_count = 2;
int32 distance = 3;
int32 elapsed_time = 4;
}
二、route_guide.pb.go 客户端文件
package routeguide
import (
proto "github.com/golang/protobuf/proto"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
// 生成的版本验证
const (
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
const _ = proto.ProtoPackageIsVersion4
// Point Point message 生成的结构体和方法
type Point struct {
// 它提供了一种不用分配就能实现ProtoReflect方法的方法,而不需要为每个消息类型生成一个shadow Go类型。这种技术只在不安全的情况下有效。
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Latitude int32 `protobuf:"varint,1,opt,name=latitude,proto3" json:"latitude,omitempty"`
Longitude int32 `protobuf:"varint,2,opt,name=longitude,proto3" json:"longitude,omitempty"`
}
func (x *Point) Reset() {
*x = Point{
}
if protoimpl.UnsafeEnabled {
mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Point) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Point) ProtoMessage() {
}
func (x *Point) ProtoReflect() protoreflect.Message {
mi := &file_examples_route_guide_routeguide_route_guide_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)
}
func (*Point) Descriptor() ([]byte, []int) {
return file_examples_route_guide_routeguide_route_guide_proto_rawDescGZIP(), []int{
0}
}
func (x *Point) GetLatitude() int32 {
if x != nil {
return x.Latitude
}
return 0
}
func (x *Point) GetLongitude() int32 {
if x != nil {
return x.Longitude
}
return 0
}
// Rectangle Rectangle message 生成的结构体和方法
type Rectangle struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Lo *Point `protobuf:"bytes,1,opt,name=lo,proto3" json:"lo,omitempty"`
Hi *Point `protobuf:"bytes,2,opt,name=hi,proto3" json:"hi,omitempty"`
}
func (x *Rectangle) Reset() {
*x = Rectangle{
}
if protoimpl.UnsafeEnabled {
mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Rectangle) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Rectangle) ProtoMessage() {
}
func (x *Rectangle) ProtoReflect() protoreflect.Message {
mi := &file_examples_route_guide_routeguide_route_guide_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)
}
func (*Rectangle) Descriptor() ([]byte, []int) {
return file_examples_route_guide_routeguide_route_guide_proto_rawDescGZIP(), []int{
1}
}
func (x *Rectangle) GetLo() *Point {
if x != nil {
return x.Lo
}
return nil
}
func (x *Rectangle) GetHi() *Point {
if x != nil {
return x.Hi
}
return nil
}
// Feature Feature message 生成的结构体和方法
type Feature struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Location *Point `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"`
}
func (x *Feature) Reset() {
*x = Feature{
}
if protoimpl.UnsafeEnabled {
mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Feature) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Feature) ProtoMessage() {
}
func (x *Feature) ProtoReflect() protoreflect.Message {
mi := &file_examples_route_guide_routeguide_route_guide_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)
}
func (*Feature) Descriptor() ([]byte, []int) {
return file_examples_route_guide_routeguide_route_guide_proto_rawDescGZIP(), []int{
2}
}
func (x *Feature) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *Feature) GetLocation() *Point {
if x != nil {
return x.Location
}
return nil
}
// RouteNote RouteNote message 生成的结构体和方法
type RouteNote struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Location *Point `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"`
Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
}
func (x *RouteNote) Reset() {
*x = RouteNote{
}
if protoimpl.UnsafeEnabled {
mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *RouteNote) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*RouteNote) ProtoMessage() {
}
func (x *RouteNote) ProtoReflect() protoreflect.Message {
mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[3]
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)
}
func (*RouteNote) Descriptor() ([]byte, []int) {
return file_examples_route_guide_routeguide_route_guide_proto_rawDescGZIP(), []int{
3}
}
func (x *RouteNote) GetLocation() *Point {
if x != nil {
return x.Location
}
return nil
}
func (x *RouteNote) GetMessage() string {
if x != nil {
return x.Message
}
return ""
}
// RouteSummary RouteSummary message 生成的结构体和方法
type RouteSummary struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
PointCount int32 `protobuf:"varint,1,opt,name=point_count,json=pointCount,proto3" json:"point_count,omitempty"`
FeatureCount int32 `protobuf:"varint,2,opt,name=feature_count,json=featureCount,proto3" json:"feature_count,omitempty"`
Distance int32 `protobuf:"varint,3,opt,name=distance,proto3" json:"distance,omitempty"`
ElapsedTime int32 `protobuf:"varint,4,opt,name=elapsed_time,json=elapsedTime,proto3" json:"elapsed_time,omitempty"`
}
func (x *RouteSummary) Reset()