在Go语言中向结构体切片追加元素

3

我有两个结构体,如下所示:

// init a struct for a single item
type Cluster struct {
  Name string
  Path string
}

// init a grouping struct
type Clusters struct {
  Cluster []Cluster
}

我想要做的是向clusters结构体追加新的项目。因此,我编写了一个方法,如下所示:

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: undefined: c

所以我尝试移动这个:
Cluster := []Cluster{}
c := Clusters{Cluster}

在for循环之上 - range。我得到的错误是:

cmd/directories.go:43:20: Cluster不是一种类型

我在这里做错了什么?
2个回答

3
错误出在循环中,你正在调用Cluster方法接收器上的AddItem函数,而该接收器未在getClusters函数内定义。在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: Cluster 不是一个类型

在 Golang 中,组合字面量 的定义如下:

组合字面量用于构造结构体、数组、切片和映射的值,并在每次计算时创建一个新值。它们由字面量的类型后跟一个括号括起来的元素列表组成。每个元素可以选择由相应的键前导。

还可以查看上面链接中的结构体字面量部分,了解有关 Composite 字面量的更多说明。

请查看Go playground上的工作代码。


一看到你的回答,我就明白了我做错了什么!谢谢,关键是要改变结构体名称。也许我需要更多的咖啡,感谢! - jaxxstorm

3

在使用变量 c 的循环之前,您需要先定义它。

出现 Cluster 不是类型 错误是由于将同一个名称 Cluster 用作类型和变量,尝试使用不同的变量名称。

clusterArr := []Cluster{}
c := Clusters{clusterArr}

for _, file := range fileList {
   ....
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接