2012-04-01 86 views
1

假设我正在写一个扫雷游戏,并且我有一个结构来保存游戏领域,其中包含一个包含地雷的二维数组。假设,我想用一些地雷初始化它。有没有办法说gameField GameField = new(GameField, 30),类似于我在java中做什么?Go,init自定义类型

下面是一些代码来说明我的观点:

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

func (this *GameField) scatterMines(numberOfMines int) { //some logic to place the numberOfMines mines randomly }

我要的是调用一个初始化,并有scatterMines FUNC自动执行。

回答

9

我在围棋结构可见模式是对应的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) 
    //... 
} 
+3

当包只包含一个导出的类型时,我也看到了这种模式,只有新的形式。所以如果该软件包被称为“gamefield”,那么你可以只有一个新功能,并做gamefield.New() – jdi 2012-04-01 14:57:21

2

Go对象没有构造函数,所以在变量初始化时无法自动执行scatterMines函数。您需要明确地调用该方法:

var GameField g 
g.scatterMines(30) 

另请参阅http://golang.org/ref/spec#The_zero_value

+0

这将是更准确的说,围棋对象没有*默认*构造函数。您可以制作自己的构造函数,但必须自己调用它们。 – 2012-04-03 02:56:59