[英]Appending to struct slice in Go
我有两个结构,像这样:
// init a struct for a single item
type Cluster struct {
Name string
Path string
}
// init a grouping struct
type Clusters struct {
Cluster []Cluster
}
我要做的是将新项目追加到集群结构中。 所以我写了一个方法,像这样:
func (c *Clusters) AddItem(item Cluster) []Cluster {
c.Cluster = append(c.Cluster, item)
return c.Cluster
}
应用程序的工作方式是,我遍历一些目录,然后附加最终目录的名称及其路径。 我有一个函数,称为:
func getClusters(searchDir string) Clusters {
fileList := make([]string, 0)
//clusterName := make([]string, 0)
//pathName := make([]string, 0)
e := filepath.Walk(searchDir, func(path string, f os.FileInfo, err error) error {
fileList = append(fileList, path)
return err
})
if e != nil {
log.Fatal("Error building cluster list: ", e)
}
for _, file := range fileList {
splitFile := strings.Split(file, "/")
// get the filename
fileName := splitFile[len(splitFile)-1]
if fileName == "cluster.jsonnet" {
entry := Cluster{Name: splitFile[len(splitFile)-2], Path: strings.Join(splitFile[:len(splitFile)-1], "/")}
c.AddItem(entry)
}
}
Cluster := []Cluster{}
c := Clusters{Cluster}
return c
}
这里的问题是我不知道执行此操作的正确方法。
目前,我得到:
cmd / directories.go:41:4:未定义:c
所以我尝试移动这个:
Cluster := []Cluster{}
c := Clusters{Cluster}
在for循环range
。 我得到的错误是:
cmd / directories.go:43:20:群集不是一种类型
我在这里做错了什么?
错误发生在循环中,在该循环中您在getClusters
函数内部getClusters
Cluster方法接收器上调用AddItem
函数。 在for循环之前定义Cluster
结构,然后按以下定义调用函数c.AddItem
:
func getClusters(searchDir string) Clusters {
fileList := make([]string, 0)
fileList = append(fileList, "f1", "f2", "f3")
ClusterData := []Cluster{}
c := Clusters{Cluster: ClusterData} // change the struct name passed to Clusters struct
for _, file := range fileList {
entry := Cluster{Name: "name" + file, Path: "path" + file}
c.AddItem(entry)
}
return c
}
您已经定义了与Clusters
结构相同的结构名称,这就是为什么会出现错误
cmd / directories.go:43:20:群集不是一种类型
在Go Play上结帐工作代码
在Golang Composite中,文字定义为:
复合文字量为结构,数组,切片和映射构造值,并在每次对其求值时创建一个新值。 它们由文字的类型和紧随其后的元素列表组成。 每个元素可以可选地在对应的关键字之后。
还可以查看上面的链接中为Composite
文字定义的结构文字部分,以获得更多描述。
在进入使用c
的循环之前,需要定义c
。
Cluster is not a type
错误是由于使用与类型和变量相同的Cluster
名称,请尝试使用其他变量名称。
clusterArr := []Cluster{}
c := Clusters{clusterArr}
for _, file := range fileList {
....
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.