Golang:在调用将项添加到数组的方法之后,数组为空

时间:2017-10-17 19:27:53

标签: arrays go struct slice

我是Golang的新手。我有这个简单的代码,我无法上班;问题是在调用方法LoadGroups之后," main"功能没有看到变化:

package main

import "fmt"

type Group struct {
    Name string
}

type Configuration struct {
    Groups []Group
}

func NewConfiguration() (error, *Configuration) {
    conf := Configuration{}
    conf.LoadGroups()
    fmt.Print("Final number of groups: ", len(conf.Groups))
    return nil, &conf
}

func (conf Configuration) LoadGroups() {
    for i := 0; i < 5; i++ {
        conf.Groups = append(conf.Groups, Group{Name: "Group " + string(i)})
        fmt.Println("Current number of groups: ", len(conf.Groups))
    }
}

func main() {
    NewConfiguration()
}

游乐场:https://play.golang.org/p/VyneKpjdA-

2 个答案:

答案 0 :(得分:4)

您正在修改配置的副本,而不是配置本身。

方法LoadGroups应该采用指向配置的指针:

package main

import "fmt"

type Group struct {
    Name string
}

type Configuration struct {
    Groups []Group
}

func NewConfiguration() (error, *Configuration) {
    conf := &Configuration{}
    conf.LoadGroups()
    fmt.Print("Final number of groups: ", len(conf.Groups))
    return nil, conf
}

func (conf *Configuration) LoadGroups() {
    for i := 0; i < 5; i++ {
        conf.Groups = append(conf.Groups, Group{Name: "Group " + string(i)})
        fmt.Println("Current number of groups: ", len(conf.Groups))
    }
}

func main() {
    NewConfiguration()
}

答案 1 :(得分:1)

LoadGroups方法必须是*Configuration的接收方,而不是Configuration。现在,每次调用LoadGroup的新副本时都会执行方法Configuration,因此其更改不会反映在原始调用方中。通过使其类型为*Configuration,对共享相同指针的方法LoadGroups的所有调用都会更改相同的Configuration实例。