Присоединение к структуре слайса в Go - PullRequest
0 голосов
/ 26 июня 2018

У меня есть две структуры, вот так:

// 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 / directoryies.go: 41: 4: не определено: c

Итак, я попытался переместить это:

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

Над циклом - range. Я получаю ошибку:

cmd / directoryies.go: 43: 20: Кластер не является типом

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вам необходимо определить c перед тем, как войдет в цикл, в котором вы его используете.

Ошибка Cluster is not a type вызвана использованием того же имени Cluster, что и тип, и переменной, попробуйте использовать другое имя переменной.

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

for _, file := range fileList {
   ....
}
0 голосов
/ 26 июня 2018

Ошибка в цикле, когда вы вызываете функцию AddItem на приемнике метода кластера, которая не определена внутри функции getClusters. Определите Cluster struct before для цикла loop, а затем вызовите функцию 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 struct, поэтому ошибка

cmd / directoryies.go: 43: 20: Кластер не является типом

Оформить заказ, рабочий код на Перейти на игровую площадку

На Голанге Составной литерал определяется как:

Составные литералы создают значения для структур, массивов, срезов и карт и создают новое значение каждый раз, когда они оцениваются. Oни состоят из типа литерала, за которым следует список в скобках элементы. Каждому элементу может предшествовать соответствующий ключ.

Также посмотрите секцию литералов структуры, определенную в ссылке выше, для литералов Composite, чтобы получить больше описания.

...