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
}
围棋有可能吗?
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
}
围棋有可能吗?
Friends是一个结构体吗?否则干脆做
type Friends []Friend
注意:正如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
。
例如,
var my_friends Friends
for i, friend := range my_friends.friends {
// bla bla
}