繁体   English   中英

在Go中追加结构片

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM