2015-08-27 5 views
1

я объявил тип, как этотКак установить поля структуры внутри среза?

type Klabel struct { 
    values []float64 
    label string 
} 

Затем я создал кусочек этого типа, как этот

kdata := []Klabel 

Как я могу установить переменную метку или добавить кусочек поплавков до значений?

Я попытался

kdata[0].label = "test" 

и

kdata := make([]Klabel, 10) 

kdata[0].label = "test" 

и

kdata = append(kdata[0], kdata[0].label = "test") 

Ну, без успеха ...

Таким образом, любая помощь приветствуется! Заранее спасибо!

ответ

5

Вы отправил это:

kdata := make([]Klabel, 10) 

kdata[0].label = "test" 

И это работает. При печати срез kdata, выход (Go Playground):

[{[] test} {[] } {[] } {[] } {[] } {[] } {[] } {[] } {[] } {[] }] 

Выходной сигнал показывает kdata имеет 10 элементов, а первый имеет значение метки: "test".

Чтобы быть более ясным, распечатать его с:

fmt.Printf("%+v", kdata) 

Выход:

[{values:[] label:test} {values:[] label:} {values:[] label:} {values:[] label:} {values:[] label:} {values:[] label:} {values:[] label:} {values:[] label:} {values:[] label:} {values:[] label:}] 

Ломтики (в отличие от карт) адресуются. Вы можете изменять поля элементов (которые являются структурами), просто индексируя срез и назначая новые значения этим полям.

Например:

kdata[0].label = "test" 
kdata[0].values = []float64{1.1, 2.2} 
kdata[0].values = append(kdata[0].values, 3.3) 

fmt.Printf("%+v", kdata[0]) 

Выход:

{values:[1.1 2.2 3.3] label:test} 

Если вы хотите добавить ломтик поплавков в values поле элемента:

vals := []float64{1.2, 2.3} 

kdata[0].values = append(kdata[0].values, vals...) // Note the 3 dot ... 
+0

Ну, правда, это работает. В следующий раз я буду читать сообщения об ошибках из компилятора более подробно ... Спасибо за ваш ответ! – Steffen

1

В качестве альтернативы к другому ответу, вы также можете сделать это:

kdata := []Klabel{{label: "test"}} 

(See on Go Playground)

Но обратите внимание, что длина среза будет 1, а не 10, так что это не совсем равнозначны.