【问题标题】:Go, init custom type走,初始化自定义类型
【发布时间】:2012-04-01 11:49:08
【问题描述】:

假设,我正在编写一个扫雷游戏,并且我有一个结构来保存游戏字段,其中包含一个带有地雷的二维数组。假设,我想用一些地雷初始化它。有没有办法说gameField GameField = new(GameField, 30),类似于我在java中所做的?

这里有一些代码来说明我的观点:

type GameField struct {
  field [20][20] int
}

func (this *GameField) scatterMines(numberOfMines int) { //一些随机放置numberOfMines地雷的逻辑 }

我想要的是调用一个初始化程序并让 scatterMines 函数自动执行。

【问题讨论】:

    标签: initialization go


    【解决方案1】:

    我在 Go 结构中看到的一种模式是对应的 NewXxx 方法(例如,image pkg):

    type GameField struct {
      field [20][20] int
    }
    
    func NewGameField(numberOfMines int) *GameField {
      g := new(GameField)
      //some logic to place the numberOfMines mines randomly
      //...
      return g
    }
    
    func main() {
        g := NewGameField(30)
        //...
    }
    

    【讨论】:

    • 当包只包含一个导出的类型时,我也看到了这种模式,即简单地拥有 New。因此,如果包被称为“gamefield”,那么你可以只使用一个 New 函数并执行 gamefield.New()
    【解决方案2】:

    Go 对象没有构造函数,因此无法在变量初始化时自动执行 scatterMines 函数。您需要显式调用该方法:

    var GameField g
    g.scatterMines(30)
    

    另见http://golang.org/ref/spec#The_zero_value

    【讨论】:

    • 更准确的说法是 Go 对象没有 default 构造函数。您可以创建自己的构造函数,但您必须自己调用它们。
    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2020-03-29
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多