gpt4 book ai didi

pointers - 由于自动生成的指针,无法在消息中嵌入消息

转载 作者:IT王子 更新时间:2023-10-29 01:46:35 26 4
gpt4 key购买 nike

我有以下 3 条 protobuf 消息。

message Item {
uint32 ID = 1;
string Name = 2;
...
}

message ItemIdsRequest{
string batchUUID = 1;
repeated uint32 itemIds = 2;
}

message ItemsResponse{
string batchUUID = 1;
repeated Item items = 2;
}

一个函数检索项目 ID 的列表,以便稍后获取其所有详细信息。这些 ID 与 batchUUID 一起存储在消息 ItemIdsRequest 中,用于通过事件源进行聚合。

然后一个函数从 messages.ItemIdsRequest 中的 int slice 中检索所有详细信息作为 []messages.Item。我将消息 ItemIdsRequest 中的 batchUUID 复制到 message.ItemsResponse 中。

但是当我尝试将返回的 []messages.Item 复制到下面的消息中时,我收到错误消息 cannot use items (type []messages.Item as type []*item)

// returns []messages.Item
itemsPB, _ := api.getItems("", items.ItemIds...)

itemsResponse := &messages.ItemsResponse{
BatchUUID: uuid.NewV4().String(),
Items: itemsPB,
}

我无法将函数更改为以下内容,因为该项目是一个指针,而不是函数返回的项目 slice 。而且我不能让函数返回“message.ItemsResponse”。

TLDR:我有两个单独的 protobuf 结构。我正在尝试在 messages.ItemsResponse items 属性中设置 []messages.items 但我不允许这样做,因为生成的 protobuf 代码使 messages.ItemsResponse items 属性成为指针。当我编辑自动生成的代码并删除指针时...一切都按预期进行。

type ItemsResponse struct {
BatchUUID string `protobuf:"bytes,1,opt,name=batchUUID,proto3" json:"batchUUID,omitempty"`
Items []*Item `protobuf:"bytes,2,rep,name=items,proto3" json:"items,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}

我是 protobuf 的新手并且不是指针方面的专家(想成为)所以我也可以使用一些帮助来理解为什么它自动生成为指针。

最佳答案

Protobuf documents that对于重复的消息字段,生成的 Go 代码将使用一片指针。这允许可选值,因为在 Go 中结构不能为 nil,但指针可以。

如果您有一个结构片段,并且您想要将其分配给一个指针片段的变量或字段,您必须“手动”生成该值。

使用一个简单的循环来做到这一点:

// returns []messages.Item
itemsPB, _ := api.getItems("", items.ItemIds...)

itemPtrs := make([]*messages.Item, len(itemsPB))
for i := range itemsPB {
itemPtrs[i] = &itemsPB[i]
}

itemsResponse := &messages.ItemsResponse{
BatchUUID: uuid.NewV4().String(),
Items: itemPtrs,
}

请注意,我们上面组装的指针 slice 指向原始 itemsPB slice 的元素。

如果您修改 api.getItems() 以返回一个指针 slice ([]*messages.Item),您可以分配它而无需创建一个 slice 的指针。

关于pointers - 由于自动生成的指针,无法在消息中嵌入消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56528859/

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