跳转到内容

Proto DSL 参考

go-zero 使用标准的 protobuf 3 语法来定义 RPC 服务。

syntax = "proto3";
package user;
option go_package = "./user";
service User {
rpc GetUser(GetUserRequest) returns (GetUserResponse);
rpc CreateUser(CreateUserRequest) returns (CreateUserResponse);
}
message GetUserRequest {
int64 id = 1;
}
message GetUserResponse {
int64 id = 1;
string name = 2;
}
message CreateUserRequest {
string name = 1;
string email = 2;
}
message CreateUserResponse {
int64 id = 1;
}

goctl 要求设置 option go_package,其值为生成的 Go 文件的相对输出路径:

option go_package = "./user"; // 生成到 ./user 目录
Proto 类型Go 类型
stringstring
int32int32
int64int64
boolbool
floatfloat32
doublefloat64
bytes[]byte
message ListUsersResponse {
repeated UserInfo users = 1;
int64 total = 2;
}
message UserInfo {
int64 id = 1;
string name = 2;
}
message CreateOrderRequest {
int64 user_id = 1;
Address address = 2;
}
message Address {
string street = 1;
string city = 2;
string zip = 3;
}
enum UserStatus {
ACTIVE = 0;
INACTIVE = 1;
BANNED = 2;
}
message UserInfo {
int64 id = 1;
string name = 2;
UserStatus status = 3;
}

goctl 会为每个 service 块生成独立的 zRPC 服务。建议每个 .proto 文件只包含一个服务。

Terminal window
# 使用 goctl(推荐)
goctl rpc protoc user.proto \
--go_out=./user \
--go-grpc_out=./user \
--zrpc_out=.
# 或直接使用 protoc
protoc user.proto \
--go_out=./user \
--go-grpc_out=./user
内容规范示例
服务名PascalCaseUserService
RPC 方法PascalCaseGetUserById
消息名PascalCaseGetUserRequest
字段名snake_caseuser_id
包名小写package user