You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 03:39:44