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

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

Barbara Streisand
Barbara Streisandasal
2024-11-07 17:51:02973semak imbas

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())
}

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:

  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

    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()

    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!

Kenyataan:
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