Rumah > pembangunan bahagian belakang > Golang > Adakah Dereferencing a Go Struct Mencipta Salinan Baharu?

Adakah Dereferencing a Go Struct Mencipta Salinan Baharu?

Patricia Arquette
Lepaskan: 2024-12-01 04:58:13
asal
546 orang telah melayarinya

Does Dereferencing a Go Struct Create a New Copy?

Adakah Dereferencing Struct Mencipta Salinan Baharu dalam Go?

In Go, apabila pembolehubah jenis struct diluluskan melalui rujukan menggunakan pengendali asterisk (*), salah tanggapan mungkin timbul bahawa pembolehubah yang dinyahrujuk mewakili alamat yang sama seperti alamat asal struct.

Walau bagaimanapun, seperti yang ditunjukkan dalam coretan kod yang diberikan:

package main

import (
    "fmt"
)

type me struct {
    color string
    total int
}

func study() *me {
    p := me{}
    p.color = "tomato"
    fmt.Printf("%p\n", &p.color) // Address of p.color
    return &p
}

func main() {
    p := study() // p is a pointer to a struct
    fmt.Printf("&p.color = %p\n", &p.color) // Address of p.color

    obj := *p // obj is a copy of the struct pointed to by p
    fmt.Printf("&obj.color = %p\n", &obj.color) // Address of obj.color

    fmt.Printf("obj = %+v\n", obj)

    p.color = "purple" // Changes color of the struct pointed by p
    fmt.Printf("p.color = %p\n", &p.color)
    fmt.Printf("p = %+v\n", p)
    fmt.Printf("obj  = %+v\n", obj)

    obj2 := *p // Another copy is made
    fmt.Printf("obj2 = %+v\n", obj2)
}
Salin selepas log masuk

Apabila kita melaksanakan kod ini, output menunjukkan bahawa obj pembolehubah yang dinyahrujuk mempunyai alamat yang berbeza daripada struct p asal . Ini kerana:

Dereferencing mencipta salinan baharu:

Baris obj := *p mencipta obj pembolehubah baharu daripada jenis yang sama seperti p (me), dan memulakannya dengan salinan nilai yang ditunjuk oleh p. Ini bermakna bahawa sebarang perubahan yang dibuat pada obj tidak akan menjejaskan struct asal.

Berkesan memberikan nilai struct baharu kepada yang lain:

Serupa dengan var obj me = *p , operasi penyahrujukan dalam obj := *p memberikan nilai struct baharu kepada obj pembolehubah. Ini mencipta salinan baharu dengan memori yang berasingan.

Menggunakan operator asterisk dengan berhati-hati:

Walaupun pengendali asterisk menyediakan semantik penunjuk, adalah penting untuk memahami kesannya terhadap pembolehubah . Apabila nilai diberikan dengan operator * (dereference), ia mencipta salinan baharu, bukan rujukan baharu kepada pembolehubah asal.

Atas ialah kandungan terperinci Adakah Dereferencing a Go Struct Mencipta Salinan Baharu?. 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