Có một foreach
cấu trúc trong ngôn ngữ Go? Tôi có thể lặp lại một lát hoặc mảng bằng cách sử dụng for
không?
range
trong for
vòng cũng được đề cập trong "Một Interlude về loại" phần (về phía cuối của nó) của Go hướng dẫn.
Có một foreach
cấu trúc trong ngôn ngữ Go? Tôi có thể lặp lại một lát hoặc mảng bằng cách sử dụng for
không?
range
trong for
vòng cũng được đề cập trong "Một Interlude về loại" phần (về phía cuối của nó) của Go hướng dẫn.
Câu trả lời:
https://golang.org/ref/spec#For_range
Câu lệnh "for" với mệnh đề "phạm vi" lặp qua tất cả các mục của một mảng, lát, chuỗi hoặc bản đồ hoặc các giá trị nhận được trên một kênh. Đối với mỗi mục, nó gán các giá trị lặp cho các biến lặp tương ứng và sau đó thực hiện khối.
Ví dụ:
for index, element := range someSlice {
// index is the index where we are
// element is the element from someSlice for where we are
}
Nếu bạn không quan tâm đến chỉ mục, bạn có thể sử dụng _
:
for _, element := range someSlice {
// element is the element from someSlice for where we are
}
Gạch dưới, _
là định danh trống , một trình giữ chỗ ẩn danh.
element
là giá trị của phần tử (bản sao) - bản thân nó không phải là phần tử. Mặc dù bạn có thể gán cho element
, nhưng điều này sẽ không ảnh hưởng đến chuỗi bên dưới.
_()
trong không gian tên cục bộ", theo quy ước , nó không phải là một phần của lib nội địa hóa. Dấu gạch dưới _
là nhãn hợp lệ và nó cũng quy ước trong Go (và Python và Scala và các lang khác) để gán _
cho các giá trị trả về mà bạn sẽ không sử dụng. Phạm vi _
trong ví dụ này được giới hạn trong phần thân của for
vòng lặp. Nếu bạn có một hàm phạm vi gói _
thì nó sẽ bị che khuất bên trong phạm vi của vòng lặp for. Có một vài gói để bản địa hóa, tôi chưa thấy sử dụng _
làm tên hàm.
Go có một foreach
cú pháp giống như. Nó hỗ trợ mảng / lát, bản đồ và kênh.
Lặp lại trên mảng hoặc lát :
// index and value
for i, v := range slice {}
// index only
for i := range slice {}
// value only
for _, v := range slice {}
Lặp lại trên bản đồ :
// key and value
for key, value := range theMap {}
// key only
for key := range theMap {}
// value only
for _, value := range theMap {}
Lặp lại qua một kênh :
for v := range theChan {}
Lặp lại qua một kênh tương đương với việc nhận từ một kênh cho đến khi nó được đóng lại:
for {
v, ok := <-theChan
if !ok {
break
}
}
chan
cách sử dụng: phạm vi trên một kênh sẽ thoát khỏi vòng lặp một cách duyên dáng nếu người viết đóng kênh tại một số điểm. Trong for {v := <-theChan}
tương đương , nó sẽ không thoát trên kênh gần. Bạn có thể kiểm tra điều này thông qua ok
giá trị trả lại thứ hai . VÍ DỤ DU LỊCH
for { ... }
là viết tắt của một vòng lặp vô hạn.
Ví dụ sau đây cho thấy cách sử dụng range
toán tử trong một for
vòng lặp để thực hiện một foreach
vòng lặp.
func PrintXml (out io.Writer, value interface{}) error {
var data []byte
var err error
for _, action := range []func() {
func () { data, err = xml.MarshalIndent(value, "", " ") },
func () { _, err = out.Write([]byte(xml.Header)) },
func () { _, err = out.Write(data) },
func () { _, err = out.Write([]byte("\n")) }} {
action();
if err != nil {
return err
}
}
return nil;
}
Ví dụ lặp lại qua một mảng các hàm để thống nhất xử lý lỗi cho các hàm. Một ví dụ hoàn chỉnh là tại sân chơi Google Google .
PS: nó cũng cho thấy rằng niềng răng treo là một ý tưởng tồi cho tính dễ đọc của mã. Gợi ý: for
điều kiện kết thúc ngay trước action()
cuộc gọi. Rõ ràng, phải không?
,
và rõ ràng hơn khi for
điều kiện kết thúc: play.golang.org/p/pcRg6WdxBd - Đây thực sự là lần đầu tiên tôi tìm thấy một đối số go fmt
theo kiểu, cảm ơn!
Trong thực tế, bạn có thể sử dụng range
mà không cần tham chiếu các giá trị trả về bằng cách sử dụng for range
đối với loại của bạn:
arr := make([]uint8, 5)
i,j := 0,0
for range arr {
fmt.Println("Array Loop",i)
i++
}
for range "bytes" {
fmt.Println("String Loop",j)
j++
}
Sau đây là mã ví dụ về cách sử dụng foreach trong golang
package main
import (
"fmt"
)
func main() {
arrayOne := [3]string{"Apple", "Mango", "Banana"}
for index,element := range arrayOne{
fmt.Println(index)
fmt.Println(element)
}
}
Đây là một ví dụ đang chạy https://play.golang.org/p/LXptmH4X_0
Có, Phạm vi :
Dạng phạm vi của vòng lặp for lặp trên một lát hoặc bản đồ.
Khi phạm vi trên một lát, hai giá trị được trả về cho mỗi lần lặp. Đầu tiên là chỉ mục và thứ hai là một bản sao của phần tử tại chỉ mục đó.
Thí dụ :
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
for i := range pow {
pow[i] = 1 << uint(i) // == 2**i
}
for _, value := range pow {
fmt.Printf("%d\n", value)
}
}
Điều này có thể rõ ràng, nhưng bạn có thể nội tuyến mảng như vậy:
package main
import (
"fmt"
)
func main() {
for _, element := range [3]string{"a", "b", "c"} {
fmt.Print(element)
}
}
đầu ra:
abc