Saya melihat rentang itu mengembalikan kunci dan "salinan" nilainya. Apakah ada cara untuk rentang tersebut untuk mengembalikan alamat item? Contoh
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for _, e := range array {
e.field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
http://play.golang.org/p/AFOGG9NGpx
Di sini "bidang" tidak diubah karena rentang mengirimkan salinan bidang, Apakah saya harus menggunakan indeks atau adakah cara lain untuk mengubah nilai?
Terima kasih sudah membaca.
MyType
?range
berfungsi dengan baik & mengembalikan apa yang telah Anda masukkan ke dalam potongan. Berikut nilai-nilai tipeMyStruct
(yang merupakan tipe nilai) berada di dalam irisan. Sebagai gantinya kita bisa meletakkan pointer tipe*MyStruct
di dalam slice. Jika Anda benar-benar membutuhkannya agar berfungsi sebagaimana mestinya, Anda dapat menggunakan indeks sebagai ganti nilai yang dikembalikan olehrange
.Jawaban:
Jawaban singkat & langsung: tidak, gunakan indeks array sebagai ganti nilainya
Jadi kode diatas menjadi:
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for idx, _ := range array { array[idx].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
sumber
array[idx]
Anda bisa malah memilih untuk memilikie := &array[idx]
di bagian atas untuk loop dan kemudian menggunakane.field1
,e.field2
, dll yang lebih mirip OP mungkin ingin (hanya dengan dua baris bukan satu)., _
seluruhnya -for idx := range array
Sudah dikatakan di komentar, tetapi bagi mereka yang mencari jawaban segera, berikut ini cara Anda dapat mencapai hasil yang diharapkan dengan menggunakan sepotong petunjuk dan dengan membuat sedikit perubahan pada kode asli.
package main import "fmt" type MyType struct { field string } func main() { // Slice of pointers instead of slice of type var array [10]*MyType // Initialize array manually for idx := range array { array[idx] = &MyType{} } for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Ini dia di taman bermain
sumber
e := &array[idx]
di dalam setiap rentang yang memiliki penunjuk itu ke penunjuk ...package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for index := range array { array[index].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
sumber