Apakah ada foreach
konstruk dalam bahasa Go? Bisakah saya beralih menggunakan slice atau array for
?
range
in for
juga disebutkan di bagian "Interlude about Types" (menjelang akhir) dari tutorial Go.
Apakah ada foreach
konstruk dalam bahasa Go? Bisakah saya beralih menggunakan slice atau array for
?
range
in for
juga disebutkan di bagian "Interlude about Types" (menjelang akhir) dari tutorial Go.
Jawaban:
https://golang.org/ref/spec#For_range
Pernyataan "untuk" dengan klausa "rentang" beriterasi melalui semua entri array, irisan, string atau peta, atau nilai yang diterima pada saluran. Untuk setiap entri itu memberikan nilai iterasi ke variabel iterasi yang sesuai dan kemudian menjalankan blok.
Sebagai contoh:
for index, element := range someSlice {
// index is the index where we are
// element is the element from someSlice for where we are
}
Jika Anda tidak peduli dengan indeks, Anda dapat menggunakan _
:
for _, element := range someSlice {
// element is the element from someSlice for where we are
}
Garis bawah,, _
adalah pengidentifikasi kosong , tempat penampung anonim.
element
adalah nilai elemen (salinan) - itu bukan elemen itu sendiri. Meskipun Anda dapat menetapkan element
, ini tidak akan mempengaruhi urutan yang mendasarinya.
_()
di namespace lokal" yang hanya dengan konvensi , itu bukan bagian dari lib lokalisasi. Garis bawah _
adalah label yang valid, dan itu juga konvensi di Go (dan Python dan Scala dan langs lainnya) untuk menetapkan _
nilai pengembalian yang tidak akan Anda gunakan. Lingkup _
dalam contoh ini terbatas pada badan for
loop. Jika Anda memiliki fungsi paket- _
lingkup maka akan dibayangi di dalam lingkup for loop. Ada beberapa paket untuk pelokalan, saya belum melihat penggunaan _
sebagai nama fungsi.
Go memiliki foreach
sintaks seperti. Ini mendukung array / irisan, peta dan saluran.
Iterate over array atau slice :
// index and value
for i, v := range slice {}
// index only
for i := range slice {}
// value only
for _, v := range slice {}
Iterate di atas peta :
// key and value
for key, value := range theMap {}
// key only
for key := range theMap {}
// value only
for _, value := range theMap {}
Iterasi melalui saluran :
for v := range theChan {}
Iterasi melalui saluran sama dengan menerima dari saluran sampai ditutup:
for {
v, ok := <-theChan
if !ok {
break
}
}
chan
penggunaan: rentang saluran akan dengan anggun keluar dari loop jika penulis menutup saluran di beberapa titik. Dalam for {v := <-theChan}
setara , itu tidak akan keluar pada saluran tutup. Anda dapat menguji ini melalui nilai ok
balik kedua . CONTOH TOUR
for { ... }
singkatan dari infinite loop.
Contoh berikut menunjukkan cara menggunakan range
operator dalam satu for
loop untuk mengimplementasikan foreach
loop.
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;
}
Contoh ini mengulangi array fungsi untuk menyatukan penanganan kesalahan untuk fungsi. Contoh lengkap ada di taman bermain Google .
PS: itu menunjukkan juga bahwa kawat gigi gantung adalah ide yang buruk untuk keterbacaan kode. Petunjuk: for
kondisi berakhir tepat sebelum action()
panggilan. Jelas, bukan?
,
dan lebih jelas di mana for
kondisinya berakhir: play.golang.org/p/pcRg6WdxBd - Ini sebenarnya pertama kalinya saya menemukan argumen balasan untuk go fmt
style, terima kasih!
Anda sebenarnya bisa menggunakan range
tanpa mereferensikan nilai pengembaliannya dengan menggunakan for range
terhadap tipe Anda:
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++
}
Berikut ini adalah contoh kode untuk cara menggunakan foreach di golang
package main
import (
"fmt"
)
func main() {
arrayOne := [3]string{"Apple", "Mango", "Banana"}
for index,element := range arrayOne{
fmt.Println(index)
fmt.Println(element)
}
}
Ini adalah contoh yang sedang berjalan https://play.golang.org/p/LXptmH4X_0
Ya, Kisaran :
Bentuk rentang for loop berulang di atas slice atau peta.
Ketika mulai dari satu irisan, dua nilai dikembalikan untuk setiap iterasi. Yang pertama adalah indeks, dan yang kedua adalah salinan elemen pada indeks itu.
Contoh:
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)
}
}
Ini mungkin terlihat jelas, tetapi Anda dapat menyejajarkan array seperti ini:
package main
import (
"fmt"
)
func main() {
for _, element := range [3]string{"a", "b", "c"} {
fmt.Print(element)
}
}
output:
abc