在Go 中,結構體是按值傳遞的,這意味著對函數內結構體所做的更改不會反映在原始結構體中。這在提供的程式碼中變得很明顯,其中結構體欄位恢復到其原始值,即使該值似乎在方法內發生了更改。
問題在於結構體如何傳遞給方法。在給定的程式碼中,TVManager 方法 sendMessage() 正在修改連接器欄位的副本,並且在該方法內所做的任何變更都不會傳回原始結構。
要解決此問題,該方法應使用指標接收器。透過在接收者前面加上星號 (*) 前綴,該方法將接收指向實際結構實例的指針,並且該方法中所做的任何更改都將應用於原始結構。
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) }
同樣,在模擬對象,sendCommand() 方法也應該使用指針接收器。
func (this *MockConnector) sendCommand(payload map[string]string) { fmt.Println("0", this) this.last_command = payload this.value = true fmt.Println("0", this) }
另一個 Go 約定是避免使用「this」或「self」作為接收者姓名。相反,建議使用與方法功能相符的簡潔且具有描述性的名稱。
透過實作這些更改,結構體欄位將成功更新,而不會恢復到其原始值。
以上是為什麼我的結構字段在 Go 中意外恢復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!