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

Adakah Dereferencing a Go Struct Mencipta Salinan Baharu?

Patricia Arquette
Patricia Arquetteasal
2024-12-01 04:58:13558semak imbas

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

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!

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