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