Dalam Go, struct diluluskan mengikut nilai, bermakna perubahan yang dibuat kepada struct dalam fungsi tidak ditunjukkan dalam struct asal. Ini menjadi jelas dalam kod yang disediakan, di mana medan struct kembali kepada nilai asalnya walaupun nilai itu nampaknya berubah dalam kaedah.
Masalahnya terletak pada cara struct dihantar kepada kaedah. Dalam kod yang diberikan, kaedah TVManager sendMessage() sedang mengubah suai salinan medan penyambung dan sebarang perubahan yang dibuat di dalam kaedah tidak disebarkan kembali kepada struct asal.
Untuk membetulkannya, kaedah harus menggunakan penerima penunjuk. Dengan memberi awalan pada penerima dengan asterisk (*), kaedah akan menerima penunjuk kepada contoh struct sebenar dan sebarang perubahan yang dibuat dalam kaedah akan digunakan pada struct asal.
func (this *TVManager) sendMessage(message string) { fmt.Println("5", this.connector) payload := map[string]string{ "id": "0", "type": "request", "uri": "ssap://system.notifications/createToast", "payload": "{'message': 'This is a message'}", } this.connector.sendCommand(payload) fmt.Println("4", this.connector) }
Begitu juga, dalam objek olok-olok, kaedah sendCommand() juga harus menggunakan penerima penuding.
func (this *MockConnector) sendCommand(payload map[string]string) { fmt.Println("0", this) this.last_command = payload this.value = true fmt.Println("0", this) }
Konvensyen Go yang lain ialah mengelak daripada menggunakan "ini" atau "diri" sebagai nama penerima. Sebaliknya, adalah disyorkan untuk menggunakan nama ringkas dan deskriptif yang sepadan dengan kefungsian kaedah.
Dengan melaksanakan perubahan ini, medan struct akan berjaya dikemas kini tanpa kembali kepada nilai asalnya.
Atas ialah kandungan terperinci Mengapa Medan Struct Saya Berbalik Secara Tidak Dijangka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!