Rumah > Artikel > pembangunan bahagian belakang > Mengapakah Saya Tidak Boleh Mengubah Suai Nilai Jenis Mudah Menggunakan Penerima Penunjuk dalam Go?
Dalam Go, penerima penunjuk dalam kaedah membenarkan anda mengubah suai nilai asal sesuatu struct. Walau bagaimanapun, ini tidak terpakai kepada jenis mudah. Soalan ini menyelidiki mengapa pengubahsuaian sedemikian tidak berfungsi dan memberikan penyelesaian.
Pertimbangkan kod ini:
package main import ( "fmt" "strconv" ) type FooInt int func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp } func main() { var fi *FooInt fi.FromString("5") fmt.Printf("%v\n", fi) // Prints <nil> }
Di sini, anda menjangkakan fungsi FromString untuk menetapkan nilai fi kepada 5. Tetapi ia mencetak
Dalam Go, argumen fungsi/kaedah, termasuk penerima, adalah salinan nilai asal. Akibatnya, pengubahsuaian dalam fungsi hanya menjejaskan salinan.
Malah untuk penunjuk, penerima adalah salinan penuding asal, bukan penuding sebenar itu sendiri. Oleh itu, pengubahsuaian yang dibuat kepada nilai penerima tidak akan menjejaskan penunjuk asal.
Untuk menyelesaikannya, terdapat beberapa pilihan:
Kembalikan Penunjuk yang Diubah Suai:
func (fi *FooInt) FromString(i string) *FooInt { num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp } func main() { var fi *FooInt fi = fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Lepaskan Penunjuk untuk Ubah Suai:
func (fi *FooInt) FromString(i string, p **FooInt) { num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp } func main() { var fi *FooInt fi.FromString("5", &fi) fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Pastikan Penerima Bukan Nihil:
func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) *fi = FooInt(num) } func main() { fi := new(FooInt) // Initialize to non-nil fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Dengan menggunakan salah satu daripada penyelesaian ini, anda boleh mengubah suai nilai jenis ringkas dengan berkesan menggunakan penerima penunjuk.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Mengubah Suai Nilai Jenis Mudah Menggunakan Penerima Penunjuk dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!