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
Barbara Streisandasal
2024-11-30 12:47:11789semak imbas

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

Setelah dilaksanakan, kod ini menghasilkan output:

{1 2} &{4 2} {1 2} {4 2} false

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

Kali ini, output menggambarkan tingkah laku yang dijangkakan:

{1 2} &{4 2} &{4 2} {4 2} true

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";
}

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