项目地址
https://github.com/envoyproxy/protoc-gen-validate
前置条件
需要安装protoc、protoc-gen-go、protoc-gen-validate, protoc和protoc-gen-go已经安装过了, 不懂的可以看之前的笔记, 传送门, 下面介绍一下protoc-gen-validate的安装和配置
1.先试用go get -d github.com/envoyproxy/protoc-gen-validate
2.然后我们需要cd到envoyproxy目录下, 我的是这样的, 然后我们在cd到protoc-gen-validate@v0.1.0目录下 
3.执行make build命令, 这样我们就可以使用protoc-gen-validate插件了
3.可以通过protoc-gen-validate命令检查, 如果不报错, 说明安装成功了
快速体验
protocol文件的编写
syntax = "proto3";import "validate.proto";option go_package=".;bark";service Bark {rpc SayHello (Person) returns (Person);}message Person {uint64 id = 1 [(validate.rules).uint64.gt = 999];string email = 2 [(validate.rules).string.email = true];string mobile = 3 [(validate.rules).string = {pattern: "^1\\d{10}$"}];}
在proto文件同级目录下创建一个名为validate.proto的文件, 贴入以下内容
syntax = "proto2";package validate;option go_package = "github.com/envoyproxy/protoc-gen-validate/validate";import "google/protobuf/descriptor.proto";import "google/protobuf/duration.proto";import "google/protobuf/timestamp.proto";// Validation rules applied at the message levelextend google.protobuf.MessageOptions {// Disabled nullifies any validation rules for this message, including any// message fields associated with it that do support validation.optional bool disabled = 1071;// Ignore skips generation of validation methods for this message.optional bool ignored = 1072;}// Validation rules applied at the oneof levelextend google.protobuf.OneofOptions {// Required ensures that exactly one the field options in a oneof is set;// validation fails if no fields in the oneof are set.optional bool required = 1071;}// Validation rules applied at the field levelextend google.protobuf.FieldOptions {// Rules specify the validations to be performed on this field. By default,// no validation is performed against a field.optional FieldRules rules = 1071;}// FieldRules encapsulates the rules for each type of field. Depending on the// field, the correct set should be used to ensure proper validations.message FieldRules {optional MessageRules message = 17;oneof type {// Scalar Field TypesFloatRules float = 1;DoubleRules double = 2;Int32Rules int32 = 3;Int64Rules int64 = 4;UInt32Rules uint32 = 5;UInt64Rules uint64 = 6;SInt32Rules sint32 = 7;SInt64Rules sint64 = 8;Fixed32Rules fixed32 = 9;Fixed64Rules fixed64 = 10;SFixed32Rules sfixed32 = 11;SFixed64Rules sfixed64 = 12;BoolRules bool = 13;StringRules string = 14;BytesRules bytes = 15;// Complex Field TypesEnumRules enum = 16;RepeatedRules repeated = 18;MapRules map = 19;// Well-Known Field TypesAnyRules any = 20;DurationRules duration = 21;TimestampRules timestamp = 22;}}// FloatRules describes the constraints applied to `float` valuesmessage FloatRules {// Const specifies that this field must be exactly the specified valueoptional float const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional float lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional float lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional float gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional float gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated float in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated float not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// DoubleRules describes the constraints applied to `double` valuesmessage DoubleRules {// Const specifies that this field must be exactly the specified valueoptional double const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional double lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional double lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional double gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional double gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated double in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated double not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// Int32Rules describes the constraints applied to `int32` valuesmessage Int32Rules {// Const specifies that this field must be exactly the specified valueoptional int32 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional int32 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional int32 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional int32 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional int32 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated int32 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated int32 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// Int64Rules describes the constraints applied to `int64` valuesmessage Int64Rules {// Const specifies that this field must be exactly the specified valueoptional int64 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional int64 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional int64 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional int64 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional int64 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated int64 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated int64 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// UInt32Rules describes the constraints applied to `uint32` valuesmessage UInt32Rules {// Const specifies that this field must be exactly the specified valueoptional uint32 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional uint32 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional uint32 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional uint32 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional uint32 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated uint32 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated uint32 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// UInt64Rules describes the constraints applied to `uint64` valuesmessage UInt64Rules {// Const specifies that this field must be exactly the specified valueoptional uint64 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional uint64 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional uint64 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional uint64 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional uint64 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated uint64 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated uint64 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// SInt32Rules describes the constraints applied to `sint32` valuesmessage SInt32Rules {// Const specifies that this field must be exactly the specified valueoptional sint32 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional sint32 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional sint32 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional sint32 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional sint32 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated sint32 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated sint32 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// SInt64Rules describes the constraints applied to `sint64` valuesmessage SInt64Rules {// Const specifies that this field must be exactly the specified valueoptional sint64 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional sint64 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional sint64 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional sint64 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional sint64 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated sint64 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated sint64 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// Fixed32Rules describes the constraints applied to `fixed32` valuesmessage Fixed32Rules {// Const specifies that this field must be exactly the specified valueoptional fixed32 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional fixed32 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional fixed32 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional fixed32 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional fixed32 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated fixed32 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated fixed32 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// Fixed64Rules describes the constraints applied to `fixed64` valuesmessage Fixed64Rules {// Const specifies that this field must be exactly the specified valueoptional fixed64 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional fixed64 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional fixed64 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional fixed64 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional fixed64 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated fixed64 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated fixed64 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// SFixed32Rules describes the constraints applied to `sfixed32` valuesmessage SFixed32Rules {// Const specifies that this field must be exactly the specified valueoptional sfixed32 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional sfixed32 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional sfixed32 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional sfixed32 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional sfixed32 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated sfixed32 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated sfixed32 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// SFixed64Rules describes the constraints applied to `sfixed64` valuesmessage SFixed64Rules {// Const specifies that this field must be exactly the specified valueoptional sfixed64 const = 1;// Lt specifies that this field must be less than the specified value,// exclusiveoptional sfixed64 lt = 2;// Lte specifies that this field must be less than or equal to the// specified value, inclusiveoptional sfixed64 lte = 3;// Gt specifies that this field must be greater than the specified value,// exclusive. If the value of Gt is larger than a specified Lt or Lte, the// range is reversed.optional sfixed64 gt = 4;// Gte specifies that this field must be greater than or equal to the// specified value, inclusive. If the value of Gte is larger than a// specified Lt or Lte, the range is reversed.optional sfixed64 gte = 5;// In specifies that this field must be equal to one of the specified// valuesrepeated sfixed64 in = 6;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated sfixed64 not_in = 7;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 8;}// BoolRules describes the constraints applied to `bool` valuesmessage BoolRules {// Const specifies that this field must be exactly the specified valueoptional bool const = 1;}// StringRules describe the constraints applied to `string` valuesmessage StringRules {// Const specifies that this field must be exactly the specified valueoptional string const = 1;// Len specifies that this field must be the specified number of// characters (Unicode code points). Note that the number of// characters may differ from the number of bytes in the string.optional uint64 len = 19;// MinLen specifies that this field must be the specified number of// characters (Unicode code points) at a minimum. Note that the number of// characters may differ from the number of bytes in the string.optional uint64 min_len = 2;// MaxLen specifies that this field must be the specified number of// characters (Unicode code points) at a maximum. Note that the number of// characters may differ from the number of bytes in the string.optional uint64 max_len = 3;// LenBytes specifies that this field must be the specified number of bytes// at a minimumoptional uint64 len_bytes = 20;// MinBytes specifies that this field must be the specified number of bytes// at a minimumoptional uint64 min_bytes = 4;// MaxBytes specifies that this field must be the specified number of bytes// at a maximumoptional uint64 max_bytes = 5;// Pattern specifes that this field must match against the specified// regular expression (RE2 syntax). The included expression should elide// any delimiters.optional string pattern = 6;// Prefix specifies that this field must have the specified substring at// the beginning of the string.optional string prefix = 7;// Suffix specifies that this field must have the specified substring at// the end of the string.optional string suffix = 8;// Contains specifies that this field must have the specified substring// anywhere in the string.optional string contains = 9;// NotContains specifies that this field cannot have the specified substring// anywhere in the string.optional string not_contains = 23;// In specifies that this field must be equal to one of the specified// valuesrepeated string in = 10;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated string not_in = 11;// WellKnown rules provide advanced constraints against common string// patternsoneof well_known {// Email specifies that the field must be a valid email address as// defined by RFC 5322bool email = 12;// Hostname specifies that the field must be a valid hostname as// defined by RFC 1034. This constraint does not support// internationalized domain names (IDNs).bool hostname = 13;// Ip specifies that the field must be a valid IP (v4 or v6) address.// Valid IPv6 addresses should not include surrounding square brackets.bool ip = 14;// Ipv4 specifies that the field must be a valid IPv4 address.bool ipv4 = 15;// Ipv6 specifies that the field must be a valid IPv6 address. Valid// IPv6 addresses should not include surrounding square brackets.bool ipv6 = 16;// Uri specifies that the field must be a valid, absolute URI as defined// by RFC 3986bool uri = 17;// UriRef specifies that the field must be a valid URI as defined by RFC// 3986 and may be relative or absolute.bool uri_ref = 18;// Address specifies that the field must be either a valid hostname as// defined by RFC 1034 (which does not support internationalized domain// names or IDNs), or it can be a valid IP (v4 or v6).bool address = 21;// Uuid specifies that the field must be a valid UUID as defined by// RFC 4122bool uuid = 22;// WellKnownRegex specifies a common well known pattern defined as a regex.KnownRegex well_known_regex = 24;}// This applies to regexes HTTP_HEADER_NAME and HTTP_HEADER_VALUE to enable// strict header validation.// By default, this is true, and HTTP header validations are RFC-compliant.// Setting to false will enable a looser validations that only disallows// \r\n\0 characters, which can be used to bypass header matching rules.optional bool strict = 25 [default = true];// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 26;}// WellKnownRegex contain some well-known patterns.enum KnownRegex {UNKNOWN = 0;// HTTP header name as defined by RFC 7230.HTTP_HEADER_NAME = 1;// HTTP header value as defined by RFC 7230.HTTP_HEADER_VALUE = 2;}// BytesRules describe the constraints applied to `bytes` valuesmessage BytesRules {// Const specifies that this field must be exactly the specified valueoptional bytes const = 1;// Len specifies that this field must be the specified number of bytesoptional uint64 len = 13;// MinLen specifies that this field must be the specified number of bytes// at a minimumoptional uint64 min_len = 2;// MaxLen specifies that this field must be the specified number of bytes// at a maximumoptional uint64 max_len = 3;// Pattern specifes that this field must match against the specified// regular expression (RE2 syntax). The included expression should elide// any delimiters.optional string pattern = 4;// Prefix specifies that this field must have the specified bytes at the// beginning of the string.optional bytes prefix = 5;// Suffix specifies that this field must have the specified bytes at the// end of the string.optional bytes suffix = 6;// Contains specifies that this field must have the specified bytes// anywhere in the string.optional bytes contains = 7;// In specifies that this field must be equal to one of the specified// valuesrepeated bytes in = 8;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated bytes not_in = 9;// WellKnown rules provide advanced constraints against common byte// patternsoneof well_known {// Ip specifies that the field must be a valid IP (v4 or v6) address in// byte formatbool ip = 10;// Ipv4 specifies that the field must be a valid IPv4 address in byte// formatbool ipv4 = 11;// Ipv6 specifies that the field must be a valid IPv6 address in byte// formatbool ipv6 = 12;}// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 14;}// EnumRules describe the constraints applied to enum valuesmessage EnumRules {// Const specifies that this field must be exactly the specified valueoptional int32 const = 1;// DefinedOnly specifies that this field must be only one of the defined// values for this enum, failing on any undefined value.optional bool defined_only = 2;// In specifies that this field must be equal to one of the specified// valuesrepeated int32 in = 3;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated int32 not_in = 4;}// MessageRules describe the constraints applied to embedded message values.// For message-type fields, validation is performed recursively.message MessageRules {// Skip specifies that the validation rules of this field should not be// evaluatedoptional bool skip = 1;// Required specifies that this field must be setoptional bool required = 2;}// RepeatedRules describe the constraints applied to `repeated` valuesmessage RepeatedRules {// MinItems specifies that this field must have the specified number of// items at a minimumoptional uint64 min_items = 1;// MaxItems specifies that this field must have the specified number of// items at a maximumoptional uint64 max_items = 2;// Unique specifies that all elements in this field must be unique. This// contraint is only applicable to scalar and enum types (messages are not// supported).optional bool unique = 3;// Items specifies the contraints to be applied to each item in the field.// Repeated message fields will still execute validation against each item// unless skip is specified here.optional FieldRules items = 4;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 5;}// MapRules describe the constraints applied to `map` valuesmessage MapRules {// MinPairs specifies that this field must have the specified number of// KVs at a minimumoptional uint64 min_pairs = 1;// MaxPairs specifies that this field must have the specified number of// KVs at a maximumoptional uint64 max_pairs = 2;// NoSparse specifies values in this field cannot be unset. This only// applies to map's with message value types.optional bool no_sparse = 3;// Keys specifies the constraints to be applied to each key in the field.optional FieldRules keys = 4;// Values specifies the constraints to be applied to the value of each key// in the field. Message values will still have their validations evaluated// unless skip is specified here.optional FieldRules values = 5;// IgnoreEmpty specifies that the validation rules of this field should be// evaluated only if the field is not emptyoptional bool ignore_empty = 6;}// AnyRules describe constraints applied exclusively to the// `google.protobuf.Any` well-known typemessage AnyRules {// Required specifies that this field must be setoptional bool required = 1;// In specifies that this field's `type_url` must be equal to one of the// specified values.repeated string in = 2;// NotIn specifies that this field's `type_url` must not be equal to any of// the specified values.repeated string not_in = 3;}// DurationRules describe the constraints applied exclusively to the// `google.protobuf.Duration` well-known typemessage DurationRules {// Required specifies that this field must be setoptional bool required = 1;// Const specifies that this field must be exactly the specified valueoptional google.protobuf.Duration const = 2;// Lt specifies that this field must be less than the specified value,// exclusiveoptional google.protobuf.Duration lt = 3;// Lt specifies that this field must be less than the specified value,// inclusiveoptional google.protobuf.Duration lte = 4;// Gt specifies that this field must be greater than the specified value,// exclusiveoptional google.protobuf.Duration gt = 5;// Gte specifies that this field must be greater than the specified value,// inclusiveoptional google.protobuf.Duration gte = 6;// In specifies that this field must be equal to one of the specified// valuesrepeated google.protobuf.Duration in = 7;// NotIn specifies that this field cannot be equal to one of the specified// valuesrepeated google.protobuf.Duration not_in = 8;}// TimestampRules describe the constraints applied exclusively to the// `google.protobuf.Timestamp` well-known typemessage TimestampRules {// Required specifies that this field must be setoptional bool required = 1;// Const specifies that this field must be exactly the specified valueoptional google.protobuf.Timestamp const = 2;// Lt specifies that this field must be less than the specified value,// exclusiveoptional google.protobuf.Timestamp lt = 3;// Lte specifies that this field must be less than the specified value,// inclusiveoptional google.protobuf.Timestamp lte = 4;// Gt specifies that this field must be greater than the specified value,// exclusiveoptional google.protobuf.Timestamp gt = 5;// Gte specifies that this field must be greater than the specified value,// inclusiveoptional google.protobuf.Timestamp gte = 6;// LtNow specifies that this must be less than the current time. LtNow// can only be used with the Within rule.optional bool lt_now = 7;// GtNow specifies that this must be greater than the current time. GtNow// can only be used with the Within rule.optional bool gt_now = 8;// Within specifies that this field must be within this duration of the// current time. This constraint can be used alone or with the LtNow and// GtNow rules.optional google.protobuf.Duration within = 9;}
在proto文件目录下执行以下命令生成validate文件
protoc -I . --go_out=plugins=grpc:. --validate_out="lang=go:." greeter.proto
server端代码
type Greeter struct{}func (g Greeter) SayHello(ctx context.Context, person *bark.Person) (*bark.Person, error) {return &bark.Person{Id: 32,}, nil}type Validator interface {Validate() error}func main() {/** 测试validate的调用p := new(bark.Person)p.Id = 1000err := p.Validate()if err != nil {panic(err)}*/interceptor := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo,handler grpc.UnaryHandler) (resp interface{}, err error) {if r, ok := req.(Validator); ok {if err := r.Validate(); err != nil {return nil, status.Error(codes.InvalidArgument, err.Error())}}return handler(ctx, req)}opt := grpc.UnaryInterceptor(interceptor)s := grpc.NewServer(opt)bark.RegisterBarkServer(s, &Greeter{})lis, err := net.Listen("tcp", ":8080")if err != nil {panic(err)}s.Serve(lis)}
client端代
func main() {conn, err := grpc.Dial(":8080", grpc.WithInsecure())if err != nil {panic(err)}defer conn.Close()c := bark.NewBarkClient(conn)res, err := c.SayHello(context.Background(), &bark.Person{Id: 1000,Email: "741883227@qq.com",Mobile: "18978057553",})if err != nil {fmt.Println("err", err)return}fmt.Println("res", res)}
启动server端然后使用client端发送请求, 如果数据没有通过校验, 则会在服务端的拦截器里拦截并且返回

更多规则请参考文档
bingo!
