it-swarm-id.com

Apakah ada foreach loop di Go?

Apakah ada konstruk foreach dalam bahasa Go? Bisakah saya beralih menggunakan slice atau array menggunakan for?

480
tatsuhirosatou

http://golang.org/doc/go_spec.html#For_statements

Pernyataan "untuk" dengan klausa "rentang" beriterasi melalui semua entri array, slice, string atau peta, atau nilai yang diterima pada saluran. Untuk setiap entri itu memberikan nilai iterasi ke variabel iterasi yang sesuai dan kemudian mengeksekusi 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.

729
Keith Thompson

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 {}

Ulangi lebih dari peta:

// key and value
for key, value := range theMap {}

// key only
for key := range theMap {}

// value only
for _, value := range theMap {}

Ulangi lebih dari saluran:

for v := range theChan {}

Iterasi melalui saluran sama dengan menerima dari saluran sampai ditutup:

for {
    v, ok := <-theChan
    if !ok {
        break
    }
}
120
Moshe Revah

Contoh berikut menunjukkan cara menggunakan operator range dalam loop for untuk mengimplementasikan loop foreach.

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 Google --- taman bermain .

PS: itu menunjukkan juga bahwa kawat gigi gantung adalah ide yang buruk untuk keterbacaan kode. Petunjuk: kondisi for berakhir tepat sebelum panggilan action(). Jelas, bukan?

12
ceving

Anda sebenarnya bisa menggunakan range tanpa mereferensikan nilai pengembaliannya dengan menggunakan for range terhadap jenis 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++
}

https://play.golang.org/p/XHrHLbJMEd

10
robstarbuck

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 berjalan https://play.golang.org/p/LXptmH4X_

8
Nisal Edu

Ya, Rentang:

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)
    }
}
  • Anda dapat melewati indeks atau nilai dengan menetapkan _.
  • Jika Anda hanya menginginkan indeks, jatuhkan nilai, seluruhnya.
3
Amitesh

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

https://play.golang.org/p/gkKgF3y5nmt

1
jpihl