Rumah > pembangunan bahagian belakang > Golang > Go Pointers: Mengapa Nampaknya Saya Boleh Meluluskan Sama ada Nilai atau Penunjuk kepada Kaedah Saya?

Go Pointers: Mengapa Nampaknya Saya Boleh Meluluskan Sama ada Nilai atau Penunjuk kepada Kaedah Saya?

Linda Hamilton
Lepaskan: 2024-11-10 13:57:02
asal
776 orang telah melayarinya

 Go Pointers: Why Does It Seem Like I Can Pass Either a Value or a Pointer to My Method?

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

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

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

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

ungkapan v.Abs() adalah bersamaan dengan kod:

vp := &v
vp.Abs()
Salin selepas log masuk

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!

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