Hãy coi chừng: Như deft_code đề cập, mã này bị rò rỉ một kênh và một goroutine khi phá vỡ vòng lặp. Không sử dụng mẫu này làm mẫu chung.
Trong đi, không có cách nào để làm cho một kiểu bất kỳ tương thích cho range
, như range
chỉ hỗ trợ lát, mảng, các kênh truyền hình và bản đồ.
Bạn có thể lặp qua các kênh bằng cách sử dụng range
, điều này hữu ích nếu bạn muốn lặp qua dữ liệu được tạo động mà không phải sử dụng một lát hoặc mảng.
Ví dụ:
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)
}
}
Đó là điều gần nhất bạn có thể phải làm một cái gì đó 'rangeable'.
Vì vậy, thông lệ phổ biến là xác định phương thức Iter()
hoặc điều gì đó tương tự trên loại của bạn và chuyển nó đến range
.
Xem the spec để đọc thêm trên range
.
Bạn có thể nêu rõ trường hợp sử dụng thực tế cho điều này không? tức là, tại sao bạn muốn điều này thay vì 'phạm vi Friends.friends' hoặc' phạm vi Friends.List() '(ví dụ chỉ)? –
Ví dụ: sau này bạn nâng cấp danh sách của mình lên danh sách hộ gia đình (nhóm bạn bè) và bạn không muốn thay đổi mã máy khách hiện tại hoạt động hoàn toàn tốt khi lặp lại từng người bạn. – Stein