В моем сервисе gRPC, который был написан на golang, у меня есть такой rpc method
с именем CreateCity
. Как видите, в этом методе я хочу создать новую запись в базе данных и вернуть всю информацию об этой записи в качестве ответа.
func (server *Server) CreateCity(context context.Context, request *proto.CreateCityRequest) (*proto.CreateCityResponse, error) {
city := proto.City {
Name: request.GetCity().Name,
Country: request.GetCity().Country,
}
err := databases.DBGORM.Table("city").Create(&city).Error
if err != nil {
utils.Logger().Println(err.Error())
return nil, status.Errorf(codes.Internal, err.Error())
}
result := &proto.CreateCityResponse {
City: &city,
}
return result, nil
}
Файл proto выглядит так:
syntax = "proto3";
package proto;
import "google/protobuf/wrappers.proto";
import "google/protobuf/timestamp.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
option go_package = "./proto";
service CityService {
rpc CreateCity(CreateCityRequest) returns (CreateCityResponse) {}
}
message City {
google.protobuf.StringValue name = 1 [json_name = "name", (gogoproto.jsontag) = "name", (gogoproto.wktpointer) = true];
google.protobuf.StringValue country = 2 [json_name = "country", (gogoproto.jsontag) = "country", (gogoproto.wktpointer) = true];
}
message CreateDealerGroupRequest {
City city = 1;
}
message CreateDealerGroupResponse {
City city = 1;
}
Можно ли динамически заполнять структуру данными без явного указания имени? Как видите, я явно указываю имя полей и их значение:
city := proto.City {
Name: request.GetCity().Name,
Country: request.GetCity().Country,
}