如何在没有代码重复的情况下初始化地图?

How to initialize map without code duplication?

我有一个名为 game 的结构类型,如下所示:

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

而且我想在 init 函数中以这种类型的结构初始化一个映射。我是这样做的

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

正如我所想,有一些代码重复。如果我可以只声明类型 (map[string]*command) 一次,那就太好了。有没有办法做到这一点?我尝试使用 reflect 但它似乎不起作用,因为 make builtin 采用类型而不是值。

这里没有代码重复。代码重复是指代码中有多个点执行相同的操作。 话虽如此,您可以保持代码原样,也可以使用构造函数,它的好处是可以在您输入的地方限制此初始化,而且恕我直言,这也是一种更简洁的方法。

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

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

这样,当你需要一个 game 对象时,你可以直接做

gameObject := game()

然后像往常一样使用映射方法(或者您也可以为此制作一个实用方法)

如果你担心重复map[string]*command两次是重复,你可以从中定义一个新的类型。

type commandsMap map[string]*command

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

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