Dalam bahasa Go, kaedah ialah fungsi terikat pada jenis tertentu dan boleh dipanggil melalui tika jenis itu. Go boleh menentukan kaedah untuk sebarang jenis, termasuk jenis tersuai (struktur, antara muka) dan jenis terbina dalam (rentetan, tatasusunan, dll.), dan juga jenis penunjuk.
Dalam Go, penunjuk juga merupakan jenis. Jenis penunjuk boleh menunjuk kepada mana-mana jenis pembolehubah, dan nilai pembolehubah boleh diubah suai melalui penunjuk. Oleh itu, dalam Go, kaedah juga boleh ditakrifkan pada jenis penunjuk.
Di bawah ini kita akan membincangkan secara mendalam beberapa konsep utama dan penggunaan petunjuk kaedah Go.
Mari kita lihat contoh dahulu dan tentukan struktur Person
:
type Person struct { Name string Age int }
Sekarang kita boleh menentukan terimaPerson
Jenis kaedah parameter:
func (p Person) ChangeName(name string) { p.Name = name }
Perhatikan bahawa p
di sini ialah nilai jenis Person
, bukan penunjuk. Jadi apabila kita memanggil kaedah di atas, nilai Person
baharu dicipta dan pengubahsuaian tidak menjejaskan pembolehubah asal.
person := Person{Name: "张三", Age: 20} person.ChangeName("李四") fmt.Println(person.Name) // 输出 "张三"
Untuk mengelakkan situasi ini, kita boleh menentukan kaedah yang menerima Person
jenis penunjuk, supaya apabila pembolehubah Person
diubah suai di dalam kaedah, pembolehubah Person
baharu tidak akan dibuat. Sebaliknya, ubah suai pembolehubah Person
asal secara langsung.
func (p *Person) ChangeName(name string) { p.Name = name } person := &Person{Name: "张三", Age: 20} person.ChangeName("李四") fmt.Println(person.Name) // 输出 "李四"
Anda boleh melihat bahawa apabila kami mentakrifkan person
sebagai pembolehubah penunjuk yang menunjuk kepada jenis Person
dan menggunakan kaedah jenis penunjuk ChangeName()
untuk mengubah suai atribut Name
, yang asal Person
Atribut Name
pembolehubah akan diubah suai.
Dalam bahasa Go, sebagai tambahan kepada keupayaan yang dinyatakan di atas untuk mengubah suai nilai pembolehubah, terdapat beberapa perbezaan lain antara kaedah nilai dan kaedah penunjuk.
Pertama sekali, kaedah penunjuk boleh mengubah suai penerima (jenis itu sendiri), manakala kaedah nilai tidak boleh.
type Counter struct { count int } func (c *Counter) Add() { c.count++ } func (c Counter) Get() int { return c.count } counter := Counter{count: 0} counter.Add() fmt.Println(counter.Get()) // 输出 1
Dalam kod di atas, kaedah Add()
ialah kaedah penunjuk yang digunakan untuk menambah nilai pembilang, manakala kaedah Get()
ialah kaedah nilai yang digunakan untuk mendapatkan nilai pembilang. . Seperti yang anda lihat, dalam kod, kami mula-mula memanggil kaedah Add()
untuk menambah nilai pembilang, dan kemudian memperoleh nilai pembilang melalui kaedah Get()
.
Perbezaan lain ialah apabila menggunakan jenis penunjuk sebagai penerima, peruntukan memori semasa menyalin jenis boleh dielakkan, yang boleh meningkatkan prestasi program.
func (p *Person) ChangeAge(age int) { p.Age = age } person := &Person{Name: "张三", Age: 20} person.ChangeAge(21)
Dalam kod di atas, kaedah ChangeAge()
ialah kaedah penunjuk yang digunakan untuk mengubah suai atribut Person
pembolehubah Age
. Memandangkan Person
ialah jenis struktur, peruntukan memori berlaku setiap kali pembolehubah jenis nilai diluluskan. Walau bagaimanapun, jika anda mentakrifkan kaedah ChangeAge()
sebagai kaedah penunjuk, anda boleh mengelakkan peruntukan memori daripada berlaku.
Dalam bahasa Go, jika kaedah ditakrifkan pada jenis penuding, tetapi kami memanggil kaedah menggunakan jenis bukan penuding, pengkompil akan secara automatik menukarnya kepada panggilan jenis penunjuk.
func (p *Person) ChangeName(name string) { p.Name = name } person := Person{Name: "张三", Age: 20} person.ChangeName("李四") fmt.Println(person.Name) // 输出 "李四"
Dalam kod di atas, kami mentakrifkan person
sebagai pembolehubah jenis nilai, tetapi mengubah suai nilai pembolehubah melalui kaedah ChangeName()
. Dalam kes ini, pengkompil secara automatik menukar person
kepada jenis penuding dan memanggil kaedah ChangeName()
.
Dalam bahasa Go, penggunaan jenis dan kaedah penunjuk adalah sangat biasa. Dengan mencipta kaedah jenis penunjuk baharu, kita boleh mengelakkan peruntukan memori semasa menyalin jenis. Pada masa yang sama, kaedah penunjuk juga boleh mengubah suai penerima. Selain itu, apabila memanggil kaedah jenis penunjuk menggunakan jenis bukan penunjuk, pengkompil secara automatik menukar panggilan kepada jenis penunjuk. Oleh itu, semasa menulis kod Go, adalah disyorkan untuk menggunakan jenis dan kaedah penunjuk secara fleksibel untuk prestasi dan struktur program yang lebih baik.
Atas ialah kandungan terperinci Perbincangan mendalam tentang beberapa konsep utama dan penggunaan petunjuk kaedah Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!