代码之家  ›  专栏  ›  技术社区  ›  jaxxstorm

附加到go中的struct slice

  •  0
  • jaxxstorm  · 技术社区  · 6 年前

    我有两个结构,就像这样:

    // 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
    
    }
    

    问题是我不知道正确的方法。

    目前,我得到:

    命令/目录。go:41:4:未定义:c

    所以我试着移动这个:

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

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

    命令/目录。转到:43:20:群集不是类型

    我在这里做错什么了?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Himanshu    6 年前

    错误在您调用的循环中 AddItem 集群方法接收器上未在内部定义的函数 getClusters 功能。定义 Cluster 先构造for循环,然后调用函数 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 结构这就是错误的原因

    命令/目录。转到:43:20:群集不是类型

    签出工作代码 Go playground

    在戈朗 Composite literal 定义为:

    复合文本为结构、数组、切片和映射构造值,并在每次求值时创建新值。他们 包含文字的类型,后跟 元素。每个元素前面可以有一个对应的 钥匙。

    还可以查看上面链接中定义的struct literals部分 Composite 文字以获取更多描述。

        2
  •  3
  •   eugenioy    6 年前

    你需要定义 c 之前 进入使用它的循环。

    这个 Cluster is not a type 错误是由于使用相同的 Cluster 名称作为类型和变量,请尝试使用其他变量名称。

    clusterArr := []Cluster{}
    c := Clusters{clusterArr}
    
    for _, file := range fileList {
       ....
    }