Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Penyahrujukan Penunjuk Berfungsi, dan Mengapa Keputusan Kadang-kadang Tidak Dijangka?

Bagaimanakah Penyahrujukan Penunjuk Berfungsi, dan Mengapa Keputusan Kadang-kadang Tidak Dijangka?

Barbara Streisand
Lepaskan: 2024-11-30 12:47:11
asal
796 orang telah melayarinya

How Does Pointer Dereferencing Work in Go, and Why Are the Results Sometimes Unexpected?

Meneroka Penyahrujukan Penunjuk dalam Go

Dalam bahasa pengaturcaraan Go, penunjuk memainkan peranan penting dalam memanipulasi data, terutamanya apabila bekerja dengan struct. Keupayaan untuk menyahrujuk petunjuk menyediakan cara yang berkuasa untuk mengakses dan mengubah suai data secara tidak langsung. Dalam perbincangan ini, kami meneroka mekanisme penyahrujukan penunjuk dalam Go, membongkar kejutan yang mungkin timbul.

Kejutan dalam Penyahrujukan Penunjuk

Pertimbangkan coretan kod Go berikut :

package main

import "fmt"

type Vertex struct {
    X, Y int
}

func main() {
    p := Vertex{1, 2}  // has type Vertex
    q := &p // has type *Vertex
    t := *q
    q.X = 4
    u := *q
    fmt.Println(p, q, t, u, t == u)
}
Salin selepas log masuk

Setelah dilaksanakan, kod ini menghasilkan output:

{1 2} &{4 2} {1 2} {4 2} false
Salin selepas log masuk

Hasil yang tidak dijangka ialah t mengekalkan nilai asal q, walaupun q.X telah diubah suai. Tingkah laku ini berpunca daripada sifat penyahrujukan penuding dalam Go.

Menyingkap Kebenaran: Penyahrujukan Penunjuk

Apabila mengakses nilai melalui penuding, Go menyahrujuk penuding, pada asasnya menyediakan salinan sementara nilai yang ditunjuk. Dalam contoh kita, apabila kita membatalkan rujukan q untuk mencipta t, kita memperoleh salinan struct Vertex. Akibatnya, sebarang perubahan yang dibuat kepada q tidak akan ditunjukkan dalam t.

Untuk memerhati perubahan dalam q hingga t, kita perlu mengekalkan hubungan penunjuk. Kod yang diubah suai berikut menggambarkan perkara ini:

package main

import "fmt"

type Vertex struct {
    X, Y int
}

func main() {
    p := Vertex{1, 2}  // has type Vertex
    q := &p // has type *Vertex
    t := q
    q.X = 4
    u := *q
    fmt.Println(p, q, t, u, *t == u)
}
Salin selepas log masuk

Kali ini, output menggambarkan tingkah laku yang dijangkakan:

{1 2} &{4 2} &{4 2} {4 2} true
Salin selepas log masuk

Dengan mengekalkan hubungan penunjuk antara q dan t, kami memastikan pengubahsuaian dibuat kepada q akan disebarkan kepada t.

Sejajar dalam C dan C

Adalah penting untuk ambil perhatian bahawa tingkah laku penyahrujukan penunjuk dalam Go adalah konsisten dengan itu dalam bahasa seperti C dan C .

struct Vertex {
    int x;
    int y;
};

int main() {
    Vertex v = {1, 2};
    Vertex* q = &v;
    Vertex t = *q;
    q->x = 4;
    std::cout << "*q: " << *q << "\n";
    std::cout << " t: " << t << "\n";
}
Salin selepas log masuk

Menjalankan kod C ini menghasilkan output yang sama dengan Go , mengukuhkan tingkah laku penyahrujukan penunjuk mengikut prinsip yang sama merentas bahasa ini.

Kesimpulannya, manakala penunjuk dereferencing dalam Go pada mulanya mungkin kelihatan mengejutkan, ia beroperasi dengan cara yang logik dan konsisten. Dengan memahami bahawa penyahrujukan menghasilkan salinan sementara, pengaturcara boleh memanfaatkan penunjuk dengan berkesan untuk menavigasi dan memanipulasi struktur data dengan tepat.

Atas ialah kandungan terperinci Bagaimanakah Penyahrujukan Penunjuk Berfungsi, dan Mengapa Keputusan Kadang-kadang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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