gpt4 book ai didi

go - 如何在protobuf中将自动生成的唯一ID字段设置为只读?

转载 作者:行者123 更新时间:2023-12-03 10:10:29 29 4
gpt4 key购买 nike

我对protobuf非常陌生,所以请和我一起裸露。
我注意到在protobuf消息类型中通常有一个唯一标识符,如下所示:

message ToDo {
int64 id = 1; // unique id
string title = 2;
string description = 3;
google.protobuf.Timestamp reminder = 4;
}
然后,该消息类型可以在服务中用于创建请求,例如
service ToDoService {
rpc Create(Todo) returns (CreateResponse) {}
}
我的预期行为是使用插入数据库时​​生成的 id处理请求。但是,这意味着 id仍可以在请求有效负载中传递,但实际上将被忽略,因为 id中的 ToDo字段仅与读取响应相关。
例如,在下面的 todo.Id方法中根本没有引用 Create
func (s *toDoServiceServer) Create(ctx context.Context, todo *v1.ToDo) (*v1.CreateResponse, error) {

// ... not relevant

// insert ToDo entity data
res, err := c.ExecContext(ctx, "INSERT INTO ToDo(`Title`, `Description`, `Reminder`) VALUES(?, ?, ?)",
todo.ToDo.Title, todo.ToDo.Description, reminder)
if err != nil {
return nil, status.Error(codes.Unknown, "failed to insert into ToDo-> "+err.Error())
}

// get ID of creates ToDo
id, err := res.LastInsertId()
if err != nil {
return nil, status.Error(codes.Unknown, "failed to retrieve id for created ToDo-> "+err.Error())
}

return &v1.CreateResponse{
Id: id,
}, nil
}
在我看来,这在向服务发出请求时有点令人困惑,因为可以假定应该提供 id,但实际上不应提供。由于protobuf中没有只读字段,是否是 ToDo具有两种不同消息类型的唯一选择,而 id仅存在于一个消息中?例如
message ToDoRequest {
// no id
string title = 1;
string description = 2;
google.protobuf.Timestamp reminder = 3;
}

message ToDo {
int64 id = 1; // unique id
string title = 2;
string description = 3;
google.protobuf.Timestamp reminder = 4;
}
这样 ToDoRequest仅用于创建/更新请求,而 ToDo仅用于读取响应。我唯一的问题是,仅仅为了使 id为“readonly”,两次定义所有其他字段似乎很繁琐。

最佳答案

您也可以撰写邮件

syntax = "proto3";

package todo;

import "google/protobuf/timestamp.proto";

message ToDo {
string title = 1;
string description = 2;
google.protobuf.Timestamp reminder = 3;
}

message ToDoEntity {
int64 id = 1;
ToDo todo = 2;
}

message ToDoRequest {
ToDo todo = 1;
}

关于go - 如何在protobuf中将自动生成的唯一ID字段设置为只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65935468/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com