Rumah > pembangunan bahagian belakang > Golang > Petunjuk dalam Go Structs: Bila dan Mengapa Saya Perlu Menggunakannya?

Petunjuk dalam Go Structs: Bila dan Mengapa Saya Perlu Menggunakannya?

Susan Sarandon
Lepaskan: 2024-12-15 20:27:18
asal
181 orang telah melayarinya

Pointers in Go Structs: When and Why Should I Use Them?

Penggunaan Penunjuk dalam Medan Struct : Menangani Implikasi dan Tukar gantinya

Menggunakan penunjuk dalam medan struct, yang digambarkan dalam coretan kod yang anda berikan , boleh memperkenalkan implikasi yang halus lagi ketara berbanding dengan menggunakan medan nilai. Memahami kesan ini adalah penting untuk membuat keputusan termaklum tentang reka bentuk struktur dalam Go.

Definisi Struktur

Penunjuk dilambangkan dengan asterisk (*) yang diawali dengan jenis dalam definisi medan struct. Medan ini menunjuk kepada nilai sebenar dan bukannya menahan nilai secara terus:

//With pointers
type Employee struct {
    FirstName *string
    Salary    *int
    FullTime  *bool
}

//Without pointers (value fields)
type EmployeeV struct {
    FirstName string
    Salary    int
    FullTime  bool
}
Salin selepas log masuk

JSON Marshaling and Unmarshaling

Apabila menggunakan JSON encoding/decoding, penunjuk medan dengan teg omitempty membolehkan anda membezakan antara medan yang ditetapkan secara eksplisit dan yang tiada dalam data JSON. Contohnya:

type Foo struct {
    Bar string  `json:"bar"`
    Foo *string `json:"foo,omitempty"`
}
Salin selepas log masuk

Jika Foo dibongkar daripada JSON tanpa medan foo, Foo.Foo akan menjadi sifar. Sebaliknya, dengan nilai sifar seperti 0, Foo.Foo akan menunjuk kepada integer dengan nilai tersebut.

Penerima Kaedah

Walaupun penunjuk mempunyai kelebihan, ia juga memperkenalkan potensi perangkap. Salah satu perangkap sedemikian ialah apabila menggunakan penerima nilai untuk kaedah yang mengubah suai medan penunjuk:

//Employee with pointer in struct field
func (e Employee) SetName(name string) {
    e.FirstName = &name //This works only if FirstName is not nil
}

//EmployeeV with value field
func (e EmployeeV) SetName(name string) {
    e.FirstName = name //This never works
}
Salin selepas log masuk

Untuk mengelakkan isu ini, gunakan penerima penunjuk untuk kaedah yang mengubah suai medan penunjuk:

type Employee struct {
    FirstName string
}

func (e *Employee) SetName(name string) {
    e.FirstName = name //This always works
}
Salin selepas log masuk

Perlumbaan Konkurensi dan Data

Risiko lain yang dikaitkan dengan penunjuk ialah perlumbaan data apabila berbilang rutin mengakses data kongsi yang sama. Pertimbangkan contoh berikut:

type Employee struct {
    FirstName *string
}

func main() {
    n := "name"
    e := Employee{FirstName: &n}

    go func() {
        *e.FirstName = "foo"
    }()

    //Race condition where multiple routines access and modify e.FirstName concurrently
}
Salin selepas log masuk

Untuk mengelakkan perlumbaan data, segerakkan akses kepada penuding dikongsi menggunakan teknik seperti primitif penyegerakan.

Pertimbangan Memori

Dari segi penggunaan memori, medan individu seperti integer dan boolean tidak memberi kesan ketara kepada penggunaan memori. Walau bagaimanapun, untuk struct yang lebih besar, menghantar penunjuk ke struct mungkin lebih cekap ingatan. Walau bagaimanapun, mengakses nilai melalui penuding memperkenalkan overhed amaran tambahan.

Kesimpulannya, sementara penunjuk dalam medan struct boleh menawarkan kelebihan tertentu, seperti membezakan antara ketiadaan medan dan nilai sifar, adalah penting untuk mempertimbangkan potensi risikonya dengan teliti. , termasuk jenis penerima, perlumbaan data dan implikasi ingatan. Memahami konsep ini akan membantu anda membuat pilihan termaklum apabila bekerja dengan medan penunjuk dalam struct Go.

Atas ialah kandungan terperinci Petunjuk dalam Go Structs: Bila dan Mengapa Saya Perlu Menggunakannya?. 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