Cara Mengubah Suai Nilai Jenis Mudah melalui Kaedah Penerima Penunjuk dalam Go
Apabila bekerja dengan jenis tersuai berdasarkan jenis asas, anda mungkin mahu untuk mengubah suai nilai mereka menggunakan fungsi penerima penunjuk. Walau bagaimanapun, apabila anda cuba berbuat demikian, anda mungkin menghadapi senario di mana perubahan kelihatan tidak berkesan. Berikut ialah penjelasan terperinci:
Isunya
Pertimbangkan kod berikut:
package main import "fmt" type FooInt int func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp // Attempting to modify the pointer } func main() { var fi *FooInt fi.FromString("5") fmt.Println(fi) // Prints nil }
Apabila anda menjalankan program ini, anda akan perasan bahawa nilai fi kekal sifar walaupun kaedah FromString cuba berubah ia.
Penjelasan
Dalam Go, semua hujah fungsi—termasuk penerima—dilalui mengikut nilai. Ini bermakna di dalam kaedah FromString, penuding fi ialah salinan penuding sebenar yang diisytiharkan dalam main. Apabila anda mengubah suai fi dalam kaedah, anda hanya mengubah suai salinan, bukan penunjuk asal.
Untuk menyelesaikan isu ini, anda mempunyai dua pilihan:
1. Kembalikan Penuding Diubahsuai
Anda boleh mengembalikan penuding yang diubah suai daripada kaedah FromString dan berikannya kembali kepada penuding asal:
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.Println(fi) // Prints the address of the modified pointer }
2. Pastikan Penerima Bukan Sifar
Sebagai alternatif, anda boleh memastikan bahawa penerima tidak sifar sebelum cuba mengubah suai nilai yang ditunjuk:
func (fi *FooInt) FromString(i string) { if fi == nil { fi = new(FooInt) // Initialize fi if it's nil } num, _ := strconv.Atoi(i) *fi = FooInt(num) } func main() { var fi *FooInt fi.FromString("5") fmt.Println(fi) // Prints the address of the modified pointer }
Ini memastikan penerima adalah dimulakan dan nilai yang ditunjuk boleh diubah suai secara langsung.
Ringkasnya, apabila mengubah suai nilai melalui penunjuk kaedah penerima dalam Go, ingat bahawa penerima adalah salinan dan anda mesti sama ada mengembalikan penunjuk yang diubah suai atau memastikan bahawa penerima adalah tidak sifar untuk mengelakkan tingkah laku yang tidak dijangka.
Atas ialah kandungan terperinci Mengapakah Mengubah Suai Jenis Mudah Melalui Kaedah Penerima Penunjuk di Go Tidak Berfungsi Seperti Yang Dijangkakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!