Go, init пользовательский тип - PullRequest
1 голос
/ 01 апреля 2012

Предположим, я пишу игру тральщика, и у меня есть структура для хранения игрового поля, которая содержит двумерный массив с минами. Предположим, я хочу инициализировать его несколькими минами Есть ли способ сказать gameField GameField = new(GameField, 30), похожий на то, что я бы сделал в Java?

Вот код, иллюстрирующий мою точку зрения:

type GameField struct { field [20][20] int }</p> <p>func (this *GameField) scatterMines(numberOfMines int) { //some logic to place the numberOfMines mines randomly }

Я хочу вызвать инициализатор и автоматически выполнить scatterMines func.

Ответы [ 2 ]

9 голосов
/ 01 апреля 2012

Шаблон, который я видел в структурах 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)
    //...
}
2 голосов
/ 01 апреля 2012

Объекты Go не имеют конструкторов, поэтому невозможно выполнить функцию scatterMines автоматически при инициализации переменной. Вам нужно вызвать метод явно:

var GameField g
g.scatterMines(30)

См. Также http://golang.org/ref/spec#The_zero_value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...