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

Mengapa Medan Go Struct Saya Berbalik Selepas Panggilan Kaedah?

DDD
DDDasal
2024-11-15 05:48:02348semak imbas

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)

Dengan:

func (this *MockConnector) sendCommand(payload map[string]string)

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!

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