Как инициализировать карту без дублирования кода? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть структурный тип, названный как game следующим образом:

type game struct {
    commands map[string]*command
    // ...
}

И я хочу инициализировать карту в структуре этого типа в функции init. Я делаю это так

func (game *game) init() {
    game.commands = make(map[string]*command)
    // ...
}

Как я думаю, есть некоторое дублирование кода. Было бы здорово, если бы я мог объявить тип (map[string]*command) только один раз. Есть способ сделать это? Я попытался использовать отражение, но, похоже, оно не работает, потому что встроенная команда make принимает тип, а не значение.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

Здесь нет дублирования кода. Дублирование кода - это когда в вашем коде есть несколько точек, которые делают одно и то же. При этом вы можете оставить свой код таким, какой он есть, или вы можете использовать конструктор, который имеет преимущество, заключающееся в ограничении инициализации там, где вы печатаете, и также является более чистым подходом imho.

type game struct {
   commands map[string]*command
}

func game() *game {
   return &game{commands: make(map[string]*command)}
}

Таким образом когда вам нужен объект game, вы можете просто сделать

gameObject := game()

и затем использовать методы карты, как обычно (или вы также можете сделать служебный метод только для этого)

1 голос
/ 05 февраля 2020

Если вы беспокоитесь, что повторение map[string]*command два раза является дублированием, вы можете определить из него новый тип.

type commandsMap map[string]*command

type game struct {
    commands commandsMap 
    // ...
}

func (game *game) init() {
    game.commands = make(commandsMap)
    // ...
}
...