Bahasa Golang sangat fleksibel dalam reka bentuk nilai pulangan fungsi Selain jenis data asas, nilai pulangan juga boleh menjadi penunjuk, tatasusunan, kepingan, struktur, dll. Terutama apabila nilai pulangan fungsi adalah jenis penunjuk, butiran lanjut perlu diberi perhatian Artikel ini akan menerangkan isu ini secara terperinci.
Dalam bahasa Golang, apabila fungsi mengembalikan jenis penunjuk, berhati-hati untuk tidak mengembalikan alamat pembolehubah setempat. Oleh kerana kitaran hayat pembolehubah tempatan hanya dalam fungsi, apabila fungsi tamat, ruang memori yang diduduki oleh pembolehubah ini akan dikitar semula Pada masa ini, penunjuk yang dikembalikan menghala ke alamat memori yang tidak sah, dan menggunakannya semula akan menyebabkan masalah yang sangat sukar untuk dikesan. Oleh itu, adalah disyorkan untuk menggunakan baharu atau membuat operasi di dalam fungsi untuk memperuntukkan ruang memori baharu dan kemudian mengembalikannya. Contohnya:
func foo() *int { var x int = 0 return &x // 错误的返回局部变量地址 } func bar() *int { var x int = 0 return new(int) // 返回新分配的内存地址 }
Dalam beberapa kes, mungkin perlu mengembalikan berbilang nilai jenis penunjuk sekali gus, tetapi ia diperlukan Ambil perhatian bahawa penunjuk ini tidak boleh menunjuk kepada pembolehubah yang sama. Kerana berbuat demikian akan menyebabkan nilai yang ditunjukkan oleh penunjuk lain berubah apabila satu penunjuk digunakan. Contohnya:
func foo() (*int, *int) { var x int = 1 return &x, &x // 错误的返回了指向同一个变量的两个指针 } func main() { p1, p2 := foo() fmt.Println(*p1, *p2) // 输出结果为1 1 *p1 = 2 fmt.Println(*p1, *p2) // 输出结果为2 2,p2的值也被改变了 }
Oleh itu, pendekatan yang betul ialah mengembalikan penunjuk kepada pembolehubah berbeza, atau mengabstrakkannya ke dalam jenis struktur dan mengembalikannya.
Isu lain yang memerlukan perhatian ialah mengubah suai nilai yang ditunjuk oleh penuding di luar fungsi boleh menyebabkan perkara yang tidak dijangka masalah . Kerana dalam bahasa Golang, penunjuk boleh dirujuk beberapa kali, dan penunjuk boleh ditunjuk oleh berbilang pembolehubah. Jika nilai yang ditunjuk oleh penunjuk diubah suai di luar fungsi, semua pembolehubah yang ditunjuk oleh penunjuk juga akan diubah. Contohnya:
func foo() *int { var x int = 1 p := &x return p } func main() { p := foo() q := p *p = 2 fmt.Println(*q) // 输出结果为2,因为q和p指向同一个变量 }
Oleh itu, untuk mengelakkan situasi ini, anda perlu menggunakan baharu atau membuat operasi di dalam fungsi untuk memperuntukkan ruang memori baharu, dan kemudian arahkan penunjuk ke ruang, untuk memastikan bahawa ia tidak akan Ia menjejaskan pembolehubah di luar fungsi.
Isu terakhir yang perlu diambil perhatian ialah jika penuding nol dikembalikan dalam fungsi, maka apabila menggunakannya A pengecualian panik akan dilemparkan apabila penunjuk digunakan. Oleh itu, anda mesti memastikan bahawa apabila menggunakan penuding, nilai yang ditunjukkannya tidak batal, jika tidak pengecualian akan dicetuskan. Sebagai contoh:
func foo() *int { return nil // 返回了一个空指针 } func main() { p := foo() *p = 1 // 引发panic异常,因为p为空指针 }
Oleh itu, untuk mengelakkan situasi ini, anda perlu membuat pertimbangan nol pada penunjuk sebelum menggunakannya.
Ringkasnya, apabila nilai pulangan fungsi adalah jenis penunjuk, terdapat banyak butiran yang perlu diberi perhatian dan mesti digunakan dengan sangat berhati-hati, jika tidak, ia akan menyebabkan pelbagai masalah yang tidak dapat diramalkan. Oleh itu, pastikan anda menyemak dan menguji dengan teliti semasa menulis kod untuk memastikan masalah ini tidak berlaku.
Atas ialah kandungan terperinci Butiran yang anda perlu beri perhatian apabila nilai pulangan fungsi Golang ialah penunjuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!