Инициализировать вложенную структурную карту - PullRequest
0 голосов
/ 31 января 2019

Проблема:

У меня есть карта структур в другой структуре, и я хотел бы инициализировать вложенную карту структур, но, очевидно, это невозможно.

Код:

type Exporter struct {
    TopicsByName      map[string]Topic
}

type Topic struct {
    Name       string
    Partitions map[int32]Partition
}

type Partition struct {
    PartitionID   int32
    HighWaterMark int64
}

// Eventually I want to do something like:
e := Exporter{ TopicsByName: make(map[string]Topic) }
for _, topicName := range topicNames {
  // This does not work because "cannot assign to struct field e.TopicsByName[topicName].Partitions in map"
  e.TopicsByName[topicName].Partitions = make(map[int32]Partition)
}

// I wanted to initialize all these maps so that I can do
e.TopicsByName[x.TopicName].Partitions[x.PartitionID] = Partition{...}

Я не понимаю, почему я не могу инициализировать вложенную структурную карту выше.Разве так плохо вкладывать карты со структурой в качестве значений?Как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Вы можете инициализировать его так, как вы ожидаете:

e := Exporter{
    TopicsByName: map[string]Topic{
        "my-topic": Topic{
            Name: "my-topic",
            Partitions: map[int32]Partition{
                int32(1): Partition{
                    PartitionID:   int32(1),
                    HighWaterMark: int64(199),
                },
            },
        },
    },
}

Это не дает прямого ответа на вопрос, так как вы хотите перебрать список тем, но если это используется в тестировании kafkaЯ настоятельно рекомендую более подробный / буквальный формат выше.

https://play.golang.org/p/zm3A7CIvbyu

0 голосов
/ 01 февраля 2019

Если вы знаете начальное значение.Почему бы не сделать это как

   val := `
     {
         "topics_by_name": {
             "name1": {
                 "name":"topicname1",
                 "partions": {
                     1: {
                         "partion_id":1,
                         "high_water_mark":12,
                     },
                     2: {} 
                 }
              },
             "name2": {}
         }
     }
    `
func main() {
   var m map[string]interface{}
   // if m has be well designed, use your designed map is better
   // init
   json.Unmarshal(val, &m)
}
0 голосов
/ 31 января 2019

Невозможно присвоить полю значение карты.Исправление заключается в назначении значения структуры для значения карты:

for _, topicName := range []string{"a"} {
    e.TopicsByName[topicName] = Topic{Partitions: make(map[int32]Partition)}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...