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