Rumah > pembangunan bahagian belakang > Golang > Mengapa Medan Go Struct Saya Berbalik Selepas Panggilan Kaedah?

Mengapa Medan Go Struct Saya Berbalik Selepas Panggilan Kaedah?

DDD
Lepaskan: 2024-11-15 05:48:02
asal
367 orang telah melayarinya

Why Does My Go Struct Field Revert After a Method Call?

Struct Field Reverting

Dalam kod Go yang disediakan, tingkah laku pelik diperhatikan apabila medan struct berubah dalam kaedah tetapi kembali kepada nilai asal apabila disemak selepas itu. Isu ini berpunca daripada fakta bahawa struct sedang diluluskan oleh nilai dan bukannya dengan penunjuk.

Penjelasan:

Dalam kaedah sendMessage struct TVManager, kaedah sendCommand bagi struct penyambung dipanggil dengan nilai struct TVManager. Apabila struct diluluskan oleh nilai, salinan struct dicipta dan diluluskan bukannya rujukan kepada struct asal.

Dalam kaedah sendCommand struct MockConnector, medan bagi struct penyambung (cth., last_command, value) diubah suai. Walau bagaimanapun, memandangkan penyambung sedang diluluskan oleh nilai, pengubahsuaian hanya digunakan pada salinan struct, bukan yang asal.

Untuk menyelesaikan isu ini, struct penyambung dalam kaedah sendCommand hendaklah dilalui dengan penuding bukannya dengan nilai. Ini membenarkan kaedah untuk mengubah suai struktur penyambung asal, bukannya salinan.

Penyelesaian:

Ganti:

func (this MockConnector) sendCommand(payload map[string]string)
Salin selepas log masuk

Dengan:

func (this *MockConnector) sendCommand(payload map[string]string)
Salin selepas log masuk

Pertimbangan Tambahan:

  • Secara amnya tidak digalakkan menggunakan "ini" sebagai nama penerima dalam Go.
  • Jika satu kaedah jenis tertentu memerlukan penerima penunjuk, amalan terbaik adalah menggunakan penerima penunjuk untuk semua kaedah jenis itu.

Atas ialah kandungan terperinci Mengapa Medan Go Struct Saya Berbalik Selepas Panggilan Kaedah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan