карта дублирует пару ключ-значение, если не присутствует - PullRequest
0 голосов
/ 12 февраля 2020

Ниже приведено определение моей структуры:

type test struct{
    Title  string
    State  string
    Counts int
}

Я хочу отобразить элементы структуры объекта следующим образом map[Title:map[State:Counts]]

Это код, который успешно это делает

func main() {
    r := make(map[string]map[string]int)
    r1 := make(map[string]int)
    var ts []test

    ts = append(ts, test{Title: "Push 1",
        State:  "Active",
        Counts: 20})
    ts = append(ts, test{Title: "Push 1",
        State:  "InActive",
        Counts: 20})
    ts = append(ts, test{Title: "Push 1",
        State:  "Checked",
        Counts: 20})
    ts = append(ts, test{Title: "Push 1",
        State:  "Active",
        Counts: 23})

    ts = append(ts, test{Title: "Push 2",
        State:  "Active",
        Counts: 20})
    ts = append(ts, test{Title: "Push 2",
        State:  "InActive",
        Counts: 23})

    for _, t := range ts {
        r1[t.State] = t.Counts
        r[t.Title] = r1

    }
    fmt.Println("struct: ", ts)
    fmt.Println("map: ", r)
}

Проблема, с которой я сталкиваюсь - это заголовок "Pu sh 2", который не имеет State: Checked, к которому добавлено значение Count предыдущего объекта. Следующий вывод выглядит следующим образом:

struct: [{Push 1 Active 20} {Push 1 InActive 20} {Push 1 Checked 20} {Push 1 Active 23} {Push 2 Active 20} {Push 2 InActive 23}]
map: map[Push 1:map[Active:20 Checked:20 InActive:23] Push 2:map[Active:20 Checked:20 InActive:23]]

Код, который я скомпилировал, находится на go детской площадке.

1 Ответ

4 голосов
/ 12 февраля 2020

r := make(map[string]map[string]int) создает только одну карту, в ней нет записей.

r1 := make(map[string]int) также создает только одну карту для подсчета состояний, но вам не нужна только одна, вам нужна отдельная. для каждого отдельного заголовка.

Поэтому вместо создания этого единственного r1 создайте внутренние карты по требованию. Разберитесь со своими структурами, и когда для ее заголовка нет внутренней карты, создайте ее и сохраните на внешней карте r.

Примерно так:

for _, t := range ts {
    counts := r[t.Title]
    if counts == nil {
        counts = make(map[string]int)
        r[t.Title] = counts
    }
    counts[t.State]++

}

Обратите внимание, что операция подсчета может быть просто counts[t.State]++.

. При этом будет получен результат (попробуйте на Go Playground ):

map:  map[Push 1:map[Active:2 Checked:1 InActive:1] Push 2:map[Active:1 InActive:1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...