2016-04-02 2 views
0

У меня есть следующий код:Go: объявление фрагмента внутри структуры?

type room struct { 
    width float32 
    length float32 
} 
type house struct{ 
    s := make([]string, 3) 
    name string 
    roomSzSlice := make([]room, 3) 
} 

func main() { 


} 

И когда я пытаюсь построить и запустить его я получаю следующие ошибки:

c:\go\src\test\main.go:10: syntax error: unexpected := 
c:\go\src\test\main.go:11: non-declaration statement outside function body 
c:\go\src\test\main.go:12: non-declaration statement outside function body 
c:\go\src\test\main.go:13: syntax error: unexpected } 

Что я сделал не так?

Спасибо!

+0

просто объявите его как другие поля. «s [] строка» в этом случае; ошибка довольно четко говорит вам, что не так. – Snowman

+0

Спасибо, но если я объявлю это, как вы сказали, какая разница между объявлением среза и объявлением массива? – Gambit2007

+0

Одна вещь состоит в том, что часть * типа * массива - это длина, поэтому массив из 3 элементов не является тем же типом, что и массив из 4 элементов, поэтому, если вы объявите массив, такой как var n [3] int то у вас есть массив из 3-х целых чисел, с срезом в том же контексте, который вы пишете: var [] int, без указания длины. Я хочу сказать, просто не волнуйтесь о массивах; на самом деле они не являются непосредственно полезными для нас почти во всех случаях. – Snowman

ответ

0

Во-первых, вы не можете назначить/инициализировать внутри структуры. Оператор: = объявляет и присваивает. Однако вы можете добиться того же результата.

Вот простой, тривиальный пример, который будет делать примерно то, что вы пытаетесь:

type house struct { 
    s []string 
} 

func main() { 
    h := house{} 
    a := make([]string, 3) 
    h.s = a 
} 

Я никогда не писал один, что путь, но если это серверы ваша цель ... он компилирует в любом случае.

4

Вы можете объявить фрагмент объявления структуры, но вы не можете его инициализировать. Вы должны сделать это разными способами.

// Keep in mind that lowercase identifiers are 
// not exported and hence are inaccessible 
type House struct { 
    s []string 
    name string 
    rooms []room 
} 

// So you need accessors or getters as below, for example 
func(h *House) Rooms()[]room{ 
    return h.rooms 
} 

// Since your fields are inaccessible, 
// you need to create a "constructor" 
func NewHouse(name string) *House{ 
    return &House{ 
     name: name, 
     s: make([]string, 3), 
     rooms: make([]room, 3), 
    } 
} 

Пожалуйста, смотрите выше как runnable example on Go Playground


EDIT

Для Инициализировать-структуру частично, в соответствии с просьбой в комментариях, можно просто изменить

func NewHouse(name string) *House{ 
    return &House{ 
     name: name, 
    } 
} 

Пожалуйста, смотрите выше как runnable example on Go Playground, снова

+0

Спасибо, но если я не хочу инициализировать срез (значение - я не хочу указывать количество элементов в нем), как бы я это сделал? – Gambit2007

+0

Просто удалите номер в make, например 's: make ([] string)'. Это может быть хорошей идеей переубедить [tour.golang.org] (http://tour.golang.org) и прочитать [Effective Go] (https://golang.org/doc/effective_go.html) уверенно не повредит, даже если это второй или третий раз. –

+1

@MarkusWMahlberg, который не будет работать - длина фрагмента необходима в качестве аргумента для 'make'. @ Gambit2007 - если вы не хотите его инициализировать, просто оставьте его в качестве нулевого значения (полностью удалите инициализацию). Он будет равен нулю и будет иметь длину 0. Вы можете его инициализировать позже, если хотите. – joshlf

Смежные вопросы