11
type Friend struct {
    name string
    age  int
}

type Friends struct {
    friends []Friend
}

我想使Friends范围成为可能,这意味着,如果我有一个my_friends带有 type的变量Friends,我可以通过以下方式循环它:

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

围棋有可能吗?

4

3 回答 3

14

Friends一个结构体吗?否则干脆做

type Friends []Friend
于 2012-10-15T13:45:28.383 回答
13

注意:正如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

于 2012-10-15T12:49:50.980 回答
0

例如,

var my_friends Friends

for i, friend := range my_friends.friends {
    // bla bla
}
于 2012-10-15T11:49:19.520 回答