Rumah > pembangunan bahagian belakang > Golang > Mengapa Mengembalikan Penunjuk Daripada Nilai dalam Fungsi 'Baharu' Go?

Mengapa Mengembalikan Penunjuk Daripada Nilai dalam Fungsi 'Baharu' Go?

Susan Sarandon
Lepaskan: 2024-12-24 02:30:11
asal
584 orang telah melayarinya

Why Return a Pointer Instead of a Value in Go's

Memahami Penggunaan Pemulangan Alamat dalam Go Constructors: New vs. Direct Return

Tidak seperti bahasa lain yang menyediakan pembina eksplisit, Go menggunakan Fungsi "Baru" menggantikan pembina. Walau bagaimanapun, mengapa adalah perkara biasa untuk mengembalikan alamat (&f) dalam fungsi "Baharu" Go, dan bukannya mengembalikan objek Fail secara terus?

Perbezaan Antara Alamat dan Pemulangan Terus

Sintaks Go membolehkan untuk mengembalikan sama ada nilai (bukan penunjuk) atau penunjuk, menyerahkan keputusan kepada pembangun. Biasanya, penunjuk dikembalikan apabila nilai lebih berguna sebagai satu. Ini terutamanya berlaku jika nilai yang dikembalikan:

1. Mempunyai Pelbagai Kaedah dengan Penerima Penunjuk:

Memulangkan penuding membolehkan kaedah merantai panggilan terus pada objek yang dikembalikan, walaupun kaedah tersebut mengambil penerima penuding. Ini menghapuskan keperluan untuk menyimpan nilai yang dikembalikan dalam pembolehubah dan memanggil kaedah secara manual.

2. Disimpan dalam Struktur Data Tidak Boleh Diatasi:

Sesetengah struktur data, seperti peta, tidak menyokong pengalamatan langsung nilai. Mengembalikan penuding memintas pengehadan ini, membenarkan panggilan kaedah pada nilai yang disimpan dalam struktur data.

3. Merupakan Struct Besar Disebalik Kerap:

Penunjuk adalah berfaedah untuk struct besar yang akan banyak disebarkan, kerana ia mengoptimumkan penggunaan dan prestasi memori.

Contoh Perbandingan:

Pertimbangkan struct mudah dengan kaedah yang mengambil penunjuk penerima:

type My int

func (m *My) Str() string { return strconv.Itoa(int(*m)) }

func createMy(i int) My { return My(i) }  // Direct return
func createMyPtr(i int) *My { return (*My)(&i) }  // Address return
Salin selepas log masuk

Apabila cuba menggunakan nilai pulangan langsung:

fmt.Println(createMy(12).Str())
Salin selepas log masuk

Ralat berlaku: "tidak boleh memanggil kaedah penunjuk pada createMy(12)". Walau bagaimanapun, dengan pemulangan alamat:

fmt.Println(createMyPtr(12).Str())
Salin selepas log masuk

Panggilan kaedah berjaya tanpa kesilapan.

Kesimpulan:

Keputusan sama ada untuk mengembalikan a penunjuk atau nilai secara langsung dalam fungsi "Baharu" Go adalah berdasarkan penggunaan yang dimaksudkan untuk objek yang dikembalikan. Penunjuk memberikan kelebihan apabila berurusan dengan kaedah dengan penerima penuding, struktur data tidak boleh alamat atau struktur besar yang akan dihantar dengan kerap.

Atas ialah kandungan terperinci Mengapa Mengembalikan Penunjuk Daripada Nilai dalam Fungsi 'Baharu' Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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