首頁  >  文章  >  後端開發  >  為什麼在 Go 中實作 `Valuer` 和 `Scanner` 介面時類型斷言失敗?

為什麼在 Go 中實作 `Valuer` 和 `Scanner` 介面時類型斷言失敗?

Patricia Arquette
Patricia Arquette原創
2024-11-06 20:00:04345瀏覽

Why Does Type Assertion Fail When Implementing `Valuer` and `Scanner` Interfaces in Go?

理解 Golang 類型斷言

在 Go 中,可以使用類型別名基於現有類型定義自訂類型。在給定的場景中,Role 類型是內建字串類型的別名。但是,在實作此自訂類型的 Valuer 和 Scanner 介面時,會遇到錯誤。

解決錯誤

錯誤訊息表明存在問題Scan方法中的類型轉換。具體來說,它抱怨嘗試將轉換後的值分配給指向角色的指標。

第一個函數 Scan 負責從資料庫中提取值並將其轉換為適當的類型。問題出在賦值行:

r = (*Role)(value.(string))

表達式 value.(string) 嘗試將 value 參數轉換為字串。但是,指派會嘗試將此轉換後的值指派給指向角色的指標。這是不正確的,因為目標應該是 *Role 類型,而不是 Role。修正後的程式碼為:

func (r *Role) Scan(value interface{}) error {
    *r = Role(value.(string))
    return nil
}

第二個函數 Value 負責將值轉換為資料庫相容的格式。給定的程式碼不正確,因為它不遵循 driver.Valuer 的預期函數簽章。修正後的程式碼為:

func (r Role) Value() (driver.Value, error) {
    return string(r), nil
}

結論

透過修正Scan 方法中的型別轉換並調整Value 方法中的函式簽名,程式碼應該可以運作依照預期,允許自訂角色類型與資料庫驅動程式互動。

以上是為什麼在 Go 中實作 `Valuer` 和 `Scanner` 介面時類型斷言失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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