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
Susan Sarandonasal
2024-12-24 02:30:11540semak imbas

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

Apabila cuba menggunakan nilai pulangan langsung:

fmt.Println(createMy(12).Str())

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

fmt.Println(createMyPtr(12).Str())

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:
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