首頁  >  文章  >  後端開發  >  為什麼我的結構字段在 Go 中意外恢復?

為什麼我的結構字段在 Go 中意外恢復?

Susan Sarandon
Susan Sarandon原創
2024-11-17 07:15:03142瀏覽

Why Does My Struct Field Revert Unexpectedly in Go?

結構體字段意外恢復

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn