Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Penetap Struktur Go Mengendalikan Nilai Laluan berbanding Rujukan Laluan?

Bagaimanakah Penetap Struktur Go Mengendalikan Nilai Laluan berbanding Rujukan Laluan?

Barbara Streisand
Barbara Streisandasal
2024-12-14 14:29:15495semak imbas

How Do Go's Struct Setters Handle Pass-by-Value vs. Pass-by-Reference?

Memahami Penetap Struktur dalam Go

Dalam Go, struct boleh dihantar ke fungsi melalui rujukan atau nilai. Apabila diluluskan dengan rujukan, fungsi boleh mengubah suai struct asal. Walau bagaimanapun, menghantar struct mengikut nilai membawa kepada penciptaan salinan baharu struct dalam fungsi dan sebarang pengubahsuaian yang dibuat pada salinan ini tidak akan mengubah struct asal.

Dalam contoh kod yang disediakan:

type T struct { Val string }

Struktur T mengandungi medan rentetan tunggal bernama Val.

func (t T) SetVal(s string) {
    t.Val = s
}

Kaedah SetVal menerima struct mengikut nilai dan cuba mengubah suai medan Valnya. Walau bagaimanapun, ini tidak berfungsi seperti yang dijangkakan kerana fungsi ini beroperasi pada salinan struct.

func (t *T) SetVal2(s string) {
    (*t).Val = s
}

Kaedah SetVal2, sebaliknya, menerima penunjuk kepada struct dan oleh itu boleh mengubah suai asal struct. Ini kerana Go secara dinamik menaip-semak penunjuk, membenarkan fungsi mengakses struct asas dan mengubah suai medannya secara langsung.

Ringkasnya, adalah penting untuk memahami bahawa struct yang diluluskan oleh nilai mencipta salinan baharu, menghalang sebarang pengubahsuaian yang dibuat dalam fungsi daripada menjejaskan struktur asal. Untuk mengubah suai struktur asal dari dalam fungsi, ia mesti diluluskan melalui rujukan, menggunakan penunjuk.

Atas ialah kandungan terperinci Bagaimanakah Penetap Struktur Go Mengendalikan Nilai Laluan berbanding Rujukan Laluan?. 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