Rumah > pembangunan bahagian belakang > Golang > Go Pointers: Nilai vs. Penerima Penunjuk - Adakah Ia Penting?

Go Pointers: Nilai vs. Penerima Penunjuk - Adakah Ia Penting?

Barbara Streisand
Lepaskan: 2024-11-07 17:51:02
asal
997 orang telah melayarinya

Go Pointers: Value vs. Pointer Receivers - Does it Matter?

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())
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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:

  1. 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
    Salin selepas log masuk

    Pengkompil mencari kaedah yang dijana dengan lancar, menerangkan sebab v.Abs() masih berfungsi walaupun v bukan penunjuk .

  2. 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()
    Salin selepas log masuk

    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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan