Dalam bahasa Go, parameter fungsi dihantar mengikut nilai, dengan pengecualian parameter penunjuk, yang akan mengubah suai nilai yang ditunjuk dan mencerminkannya pada pemanggil. Apabila menghantar penuding, memori tambahan perlu diperuntukkan untuk menyimpan penuding, yang boleh menyebabkan masalah penggunaan memori. Masalah ini boleh diselesaikan dengan menghantar salinan penunjuk mengikut nilai, mengelakkan peruntukan tambahan.
Dalam bahasa Go, parameter fungsi dihantar mengikut nilai. Ini bermakna bahawa nilai parameter yang dihantar ke fungsi disalin di dalam fungsi, jadi sebarang perubahan pada parameter tidak akan menjejaskan pemanggil fungsi. Walau bagaimanapun, terdapat pengecualian apabila hujah adalah penunjuk.
Dalam kes ini, apa yang dihantar kepada fungsi bukanlah salinan nilai, tetapi penunjuk kepada nilai ini. Ini bermakna bahawa fungsi boleh mengubah suai nilai yang ditunjukkan, dan perubahan ini akan ditunjukkan dalam pemanggil fungsi.
Walaupun fungsi ini sangat berguna, ia juga disertakan dengan beberapa kemungkinan overhed memori. Kerana bahasa Go mesti memperuntukkan memori tambahan untuk setiap panggilan fungsi untuk menyimpan penunjuk. Peruntukan memori tambahan ini boleh menjadi punca masalah, terutamanya apabila fungsi dipanggil dengan kerap dan mempunyai sejumlah besar parameter.
Contoh kod berikut menunjukkan kesan penunjuk parameter formal pada penggunaan memori:
package main import "fmt" func main() { // 创建一个大型内存对象 largeObject := make([]byte, 10000000) // 这个函数接受一个指针参数 testFunction(&largeObject) // 测试函数执行后,释放内存对象 largeObject = nil } func testFunction(p *[]byte) { // 访问通过指针传递的值 fmt.Println(len(*p)) }
Dalam contoh ini, fungsi testFunction
menerima penunjuk kepada []bait</ kod> taip penunjuk. Apabila fungsi dipanggil, ia memperuntukkan memori tambahan untuk menyimpan penuding kepada <code>largeObject
. Peruntukan tambahan ini meningkatkan penggunaan memori program, walaupun jika largeObject
diuruskan selepas fungsi kembali. testFunction
函数接收一个指向 []byte
类型的指针。当函数被调用时,它会分配额外的内存来存储指向 largeObject
的指针。这种额外的分配会增加程序的内存消耗,即使 largeObject
在函数返回后被释放。
要解决此问题,可以使用按值传递指针。这种方法将为每个函数调用创建一个指向值的副本,从而避免创建额外的指针。为此,可以在函数签名中使用 *
*
dalam tandatangan fungsi: func testFunction2(*[]byte) { // 访问按值传递的指针副本 }
Atas ialah kandungan terperinci Memecahkan jawapan: Penggunaan memori parameter formal dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!