Go Pointer: Demystifying Pointer Semantics
Poinrers ialah konsep asas dalam pengaturcaraan Go yang membolehkan manipulasi alamat memori dan nilai melalui rujukan. Walaupun penunjuk berkongsi persamaan dengan bahasa pengaturcaraan lain, semantik penunjuk Go boleh menjadi unik dan boleh menyebabkan kekeliruan bagi pemula.
Pertimbangkan kod berikut:
type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3, 4} fmt.Println(v.Abs()) }
Coretan kod mentakrifkan struct Vertex dan kaedah func (v *Vertex) Abs(), yang mengira nilai mutlak koordinat puncak. Dengan mengisytiharkan penerima kaedah sebagai penunjuk *Puncak, kami menunjukkan bahawa kaedah itu beroperasi pada penuding kepada nilai Pucuk.
Jika kami mengubah suai kod seperti berikut:
func (v Vertex) Abs() float64 { [...] v := &Vertex{3, 4} }
di mana penerima bukan lagi penunjuk tetapi nilai (Vertex), kita akan memperoleh hasil yang sama. Sebab untuk ini adalah dua kali ganda:
Penerbitan Kaedah: Go membolehkan terbitan kaedah dengan penerima penunjuk daripada kaedah dengan penerima nilai. Ini menunjukkan bahawa kaedah func (v Vertex) Abs() secara automatik menjana pelaksanaan kaedah tambahan:
func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) } func (v *Vertex) Abs() float64 { return Vertex.Abs(*v) } // GENERATED METHOD
Apabila anda memanggil v.Abs(), di mana v bukan penunjuk, pengkompil akan mencari secara automatik dan gunakan kaedah yang dijana.
Pengambilan Alamat Automatik: Go mempunyai keupayaan untuk mengambil alamat pembolehubah secara automatik. Dalam kod di bawah:
func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) } func main() { v := Vertex{3, 4} v.Abs() }
ungkapan v.Abs() adalah bersamaan dengan kod:
vp := &v vp.Abs()
Dalam senario ini, pengkompil secara automatik mengambil alamat pembolehubah v dan menghantarnya kepada fungsi kaedah penerima penunjuk (v *Vertex) Abs().
Oleh itu, dalam kes pengubahsuaian kod yang anda nyatakan, tidak kira sama ada anda menghantar nilai atau penuding kepada Abs( ) kaedah, semantik penunjuk Go memastikan tingkah laku yang betul. Walau bagaimanapun, secara umumnya dianggap sebagai amalan yang baik untuk menggunakan penunjuk apabila bekerja dengan jenis rujukan seperti struct dalam Go.
Atas ialah kandungan terperinci Go Pointers: Mengapa Nampaknya Saya Boleh Meluluskan Sama ada Nilai atau Penunjuk kepada Kaedah Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!