使结构“具有范围”?

时间:2012-10-15 11:08:26

标签: go

type Friend struct {
    name string
    age  int
}

type Friends struct {
    friends []Friend
}

我想让Friends范围合适,这意味着,如果我的变量my_friends的类型为Friends,我可以通过以下方式循环播放:

for i, friend := range my_friends {
    // bla bla
}

可以在Go吗?

3 个答案:

答案 0 :(得分:12)

好友作为结构吗?否则只需做

type Friends []Friend

答案 1 :(得分:10)

小心:提及deft_code时,此代码会在循环中断时泄漏通道和goroutine。不要将其用作一般模式。


在go中,无法使range的任意类型兼容,如 range仅支持切片,数组,通道和地图。

您可以使用range迭代通道,如果您想要迭代动态生成的数据而不必使用切片或数组,这非常有用。

例如:

func Iter() chan *Friend {
   c := make(chan *Friend)
   go func() {
      for i:=0; i < 10; i++ {
        c <- newFriend()
      }
      close(c)
   }()
   return c
}

func main() {
  // Iterate 
  for friend := range Iter() {
    fmt.Println("A friend:", friend)
  }
}

这是你可以做的最接近的事情。“

所以通常的做法是在你的类型上定义方法Iter()或类似的东西 将其传递给range

有关range的进一步阅读,请参阅the spec

答案 2 :(得分:0)

例如,

var my_friends Friends

for i, friend := range my_friends.friends {
    // bla bla
}