【问题标题】:How to initialize map without code duplication?如何在不重复代码的情况下初始化地图?
【发布时间】:2020-05-21 07:17:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: go types code-duplication


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      gameObject := game()
      

      然后像往常一样使用 map 方法(或者你也可以为此创建一个实用方法)

      【讨论】:

      • 但是如果你想改变key的类型,你将不得不在你的代码中改变它两次。这不是代码重复的定义吗?为什么我的问题被否决了?
      • 当然,当您更改某物的类型时,您必须更改所有对它的引用。但这不是代码重复,而是代码的工作方式。代码重复是,例如,当您同时拥有执行相同操作的类型构造函数和 init 方法时,在这种情况下初始化您的映射字段。
      • 在这种情况下,你的代码中会有两个点做同样的事情,所以现在你有一些代码重复。但在这种情况下你不是,因为如果你认为代码重复只是在你的代码中多次存在相同的标识符时,那么祝你写程序好运!例如,如果您有两个字符串变量,则必须将单词string 写两次。你认为这是代码重复吗?剧透警告:它不是;)
      猜你喜欢
      • 1970-01-01
      • 2018-04-21
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多