#go #iteration #protocol-buffers #grpc
#Вперед #итерация #протокол-буферы #grpc
Вопрос:
Моя спецификация буфера протокола выглядит следующим образом:
message CreateContextRequest {
map<string, google.protobuf.ListValue> my_mapping = 2;
}
Мой код Go, который использует этот буфер протокола, выглядит следующим образом:
1: fmt.Println("protocBuff = ", protocBuff);
2: fmt.Println("protocBuff.MyMapping = ", protocBuff.MyMapping);
3: for myKey, myListValue := range protocBuff.MyMapping {
4: fmt.Println("myKey:", myKey, "=>", "myListValue:", myListValue)
5: for _, element := range myListValue {
6: fmt.Printf("element = ", element)
7: }
8: }
Строки 1-4 работают нормально. Но строка # 5 выдает эту ошибку во время компиляции: cannot range over myListValue (type *structpb.ListValue)
Итак, как я могу выполнить итерацию по myListValue?
Ответ №1:
Определение ListValue (с удаленными частными полями) является:
type ListValue struct {
// Repeated field of dynamically typed values.
Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
}
Итак, чтобы выполнить итерацию по этому, вы можете использовать:
for _, element := range myListValue.Values
for _, element := range myListValue.GetValues()
(безопаснее, поскольку он проверяетnil
myListValue
)for _, element := range myListValue.AsSlice()
(может быть лучше, зависит от того, что вы делаете со значениями).