Dalam bahasa Go, kita boleh menambah gelagat pada objek melalui kaedah. Apabila mentakrifkan kaedah, kita boleh menentukan penerima Penerima boleh menjadi jenis nilai (seperti int, float) atau jenis penunjuk (seperti int, float), yang menentukan sama ada untuk menggunakan hantaran nilai atau. Hantaran penunjuk. Menggunakan penunjuk sebelum nama kaedah dipanggil penunjuk sebelum kaedah. Artikel ini akan meneroka kelebihan, keburukan dan senario penggunaan menggunakan penunjuk sebelum kaedah.
Dalam bahasa Go, mengisytiharkan kaedah boleh menjadi seperti ini:
func (s Struct) method() {} func (s *Struct) pointerMethod() {}
Penerima kaedah pertama ialah jenis nilai, dan penerima kaedah pertama adalah jenis nilai Penerima kedua-dua kaedah adalah jenis penunjuk.
Menggunakan penunjuk sebelum nama kaedah kaedah kedua dipanggil penunjuk pra kaedah.
Penunjuk sebelum kaedah boleh mengubah suai nilai yang ditunjukkan oleh penerima, tetapi jenis nilai tidak boleh.
type Person struct { Name string Age int } func (p *Person) SetAge(age int) { p.Age = age } func main() { p := &Person{Name: "Bob", Age: 20} fmt.Printf("Before: %v ", p.Age) p.SetAge(25) fmt.Printf("After: %v ", p.Age) }
Output:
Before: 20 After: 25
Apabila menggunakan jenis nilai sebagai penerima, kaedah akan menyalin keseluruhan objek. Apabila menggunakan jenis penunjuk sebagai penerima, kaedah hanya menyalin penunjuk. Oleh itu, apabila menggunakan jenis penuding sebagai penerima, anda boleh mengelakkan masalah prestasi yang disebabkan oleh objek besar yang disalin.
type BigStruct struct { Data [1000000]int } func (s *BigStruct) method() {} func main() { b := BigStruct{} b.method() }
Apabila menggunakan jenis nilai sebagai penerima, memanggil kaedah method
akan menyalin keseluruhan objek BigStruct
, menyebabkan masalah prestasi. Menggunakan jenis penunjuk sebagai penerima boleh mengelakkan masalah ini.
Apabila menggunakan jenis penunjuk sebagai penerima, anda perlu menyemak sama ada penerima adalah penunjuk nol . Jika tidak, NullPointerException akan berlaku apabila beroperasi pada penerima dalam kaedah tersebut.
type Person struct { Name string Age int } func (p *Person) SetAge(age int) { if p == nil { return } p.Age = age } func main() { var p *Person p.SetAge(25) }
Dalam kod di atas, p.SetAge(25)
akan mencetuskan pengecualian penuding nol kerana p
ialah penuding nol. Oleh itu, anda perlu memberi perhatian untuk menyemak keadaan penunjuk nol apabila menggunakan penunjuk sebelum kaedah.
Menggunakan jenis penunjuk sebagai penerima boleh menyebabkan kod sukar difahami dan terdedah kepada kesamaran.
func (s *Struct) method() {} func (s *Struct) pointerMethod() {} func main() { s := Struct{} s.pointerMethod() }
Dalam kod di atas, s.pointerMethod()
boleh menyebabkan pembaca bertanya: Mengapa kaedah penunjuk dipanggil apabila menggunakan jenis nilai?
Dalam bahasa Go, menggunakan penunjuk sebelum kaedah mempunyai kelebihan dan kekurangannya.
Apabila menggunakan jenis penunjuk sebagai penerima, anda boleh mengubah suai nilai yang ditunjuk oleh penerima, mengelakkan penyalinan objek besar, dsb. Walau bagaimanapun, ia juga boleh menyebabkan masalah seperti pengecualian penuding nol dan menjejaskan kebolehbacaan kod.
Oleh itu, apabila menggunakan penunjuk hadapan kaedah, anda perlu menimbang kelebihan dan kekurangan serta memilih kaedah yang sesuai dengan anda. Jika anda perlu mengubah suai nilai yang ditunjukkan oleh penerima, atau mengelakkan penyalinan objek besar, anda boleh menggunakan jenis penunjuk sebagai penerima jika tidak, anda boleh menggunakan jenis nilai sebagai penerima.
Atas ialah kandungan terperinci penunjuk hadapan kaedah golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!