Gorm与sql/driver自定义字符串转Bool类型实现方案
Gorm 自定义字符串转布尔类型实现
参照你之前实现StringConcat的思路,自定义类型实现sql.Scanner和driver.Valuer接口即可,完全匹配你定义的转换规则。
自定义类型代码
import ( "database/sql/driver" "strings" ) // StringBool 适配数据库字符串存储的布尔自定义类型 type StringBool bool // Scan 实现读库时的类型转换 func (s *StringBool) Scan(value interface{}) error { if value == nil { *s = false return nil } var rawStr string switch v := value.(type) { case []byte: rawStr = string(v) case string: rawStr = v default: *s = false return nil } trimmed := strings.TrimSpace(rawStr) // 按规则转换:空字符串、None返回false,其余非空值返回true if trimmed == "" || trimmed == "None" { *s = false return nil } *s = true return nil } // Value 实现写库时的类型转换 func (s StringBool) Value() (driver.Value, error) { // 写库映射规则可根据业务需求自行调整,示例为true返回"1"、false返回空串 if s { return "1", nil } return "", nil }
结构体字段调整
将原结构体中FieldFour的类型替换为StringBool即可,注意修正原代码里FieldFour写错的json标签:
type Name struct { FieldOne *String `json:"fieldOne,omitempty" gorm:"column:nlfieldOne"` FieldTwo *[]String `json:"fieldTwo,omitempty" gorm:"column:nlfieldTwo"` FieldThree *[]String `json:"fieldThree,omitempty" gorm:"column:nlfieldThree"` FieldFour StringBool `json:"fieldFour,omitempty" gorm:"column:nlfieldFour"` }
补充说明
- 实现中兼容了数据库返回
nil、字符串首尾带多余空格的场景,避免存储格式不规整导致判断错误 - 如果业务需要字段支持null值,可将字段类型改为
*StringBool,在Scan方法中补充指针初始化逻辑即可 Value方法的写库返回值可以按需调整,比如需要写入"true"/"false"、"Yes"/"No"等格式,直接修改分支返回值即可
内容的提问来源于stack exchange,提问作者KCYrgn
相关产品推荐
相关产品推荐

