Penunjuk Go: Pandangan Lebih Dekat pada Penerima Nilai dan Penunjuk
Dalam Go, penunjuk memainkan peranan penting dalam mengurus memori dengan berkesan dan mencipta yang boleh digunakan semula struktur data. Pemula sering bergelut dengan konsep penunjuk, terutamanya kerana ia berbeza daripada bahasa seperti C/C . Artikel ini bertujuan untuk menjelaskan nuansa petunjuk Go dan menangani salah tanggapan biasa.
Pertimbangkan coretan kod di bawah, yang dipinjam daripada Go Tour #52:
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()) }
Di sini, kami mentakrifkan struct Puncak, dan kaedah Abs yang mengira nilai mutlak sesuatu bucu. Penerima v Abs ialah penunjuk ke Puncak. Ini bermakna Abs beroperasi pada penunjuk kepada bucu, membenarkan pengubahsuaian pada bucu asal.
Sekarang, mari kita pertimbangkan sedikit pengubahsuaian pada kod:
func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) }
Menariknya, pengubahsuaian ini membawa kepada hasil yang sama. Persoalan kami timbul: adakah terdapat perbezaan antara menggunakan *Puncak atau Pucuk sebagai penerima untuk Abs?
Jawapannya terletak pada dua peraturan asas Go:
Penukaran Penerima Nilai dan Penunjuk: Go membolehkan memperoleh kaedah dengan penerima penunjuk daripada kaedah dengan penerima nilai. Oleh itu, func (v Vertex) Abs() float64 secara automatik menjana pelaksanaan 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
Pengkompil mencari kaedah yang dijana dengan lancar, menerangkan sebab v.Abs() masih berfungsi walaupun v bukan penunjuk .
Pengambilan Alamat Automatik: Go boleh mengambil alamat pembolehubah secara automatik. Ini bermakna apabila memanggil v.Abs() dalam kod yang diubah suai tanpa penerima penuding, ia bersamaan dengan:
vp := &v vp.Abs()
Oleh itu, fungsi itu masih menerima penuding ke bucu, tidak kira sama ada kita menggunakan secara eksplisit & .
Atas ialah kandungan terperinci Go Pointers: Nilai vs. Penerima Penunjuk - Adakah Ia Penting?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!