Как выполнить итерацию по google.protobuf.Значение списка

#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() (может быть лучше, зависит от того, что вы делаете со значениями).