2013-08-04 11 views
16

próbuję wdrożyć 2 prostych konstrukcjom następująco:Go - dołącz do krojenia w struktury

package main 

import (
    "fmt" 
) 

type MyBoxItem struct { 
    Name string 
} 

type MyBox struct { 
    Items []MyBoxItem 
} 

func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { 
    return append(box.Items, item) 
} 

func main() { 

    item1 := MyBoxItem{Name: "Test Item 1"} 
    item2 := MyBoxItem{Name: "Test Item 2"} 

    items := []MyBoxItem{} 
    box := MyBox{items} 

    AddItem(box, item1) // This is where i am stuck 

    fmt.Println(len(box.Items)) 
} 

Co robię źle? Ja po prostu chcę wywołać metodę AddItem na polu struktury i przekazać element

Odpowiedz

27

Hmm ... To jest najczęstszą błąd popełniany przez ludzi przy dołączaniu do plasterków w Go. Musisz przypisać wynik do plasterka.

func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { 
    box.Items = append(box.Items, item) 
    return box.Items 
} 

Również zdefiniowaniu AddItem dla *MyBox typu, tak nazywają tę metodę jako box.AddItem(item1)

+0

Musisz przypisać wynik z powrotem do plasterka, dokładnie to, czego nie robi. Dzięki – Raf

9
package main 

import (
     "fmt" 
) 

type MyBoxItem struct { 
     Name string 
} 

type MyBox struct { 
     Items []MyBoxItem 
} 

func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { 
     box.Items = append(box.Items, item) 
     return box.Items 
} 

func main() { 

     item1 := MyBoxItem{Name: "Test Item 1"} 

     items := []MyBoxItem{} 
     box := MyBox{items} 

     box.AddItem(item1) 

     fmt.Println(len(box.Items)) 
} 

Playground


wyjściowa:

1