首页  >  文章  >  后端开发  >  我应该如何将 MySQL 的 `bit(1)` 类型映射到 Go 类型?

我应该如何将 MySQL 的 `bit(1)` 类型映射到 Go 类型?

Susan Sarandon
Susan Sarandon原创
2024-11-23 06:41:16801浏览

How should I map MySQL's `bit(1)` type to a Go type?

如何将 MySQL 的 bit 类型映射到 Go 的类型

在 MySQL 中,bit(1) 数据类型用于存储布尔值。迁移到 Go 时,开发人员经常面临确定将其映射到的适当 Go 类型的挑战。

问题:
在提供的示例中,MySQL 表包含一个名为删除了类型 bit(1)。应使用什么 Go 类型来表示 Go 结构中的此列?

答案:
建议的方法是使用 sqlx 库提供的自定义数据类型。 sqlx 定义了一个名为 BitBool 的类型,专门处理 BIT(1) 值:

// BitBool is an implementation of a bool for the MySQL type BIT(1).
// This type allows you to avoid wasting an entire byte for MySQL's boolean type TINYINT.
type BitBool bool

BitBool 实现了 Go 的 bool 类型和 MySQL 的 BIT(1) 类型之间转换所需的接口:

// Value implements the driver.Valuer interface,
// and turns the BitBool into a bitfield (BIT(1)) for MySQL storage.
func (b BitBool) Value() (driver.Value, error) {
    if b {
        return []byte{1}, nil
    } else {
        return []byte{0}, nil
    }
}

// Scan implements the sql.Scanner interface,
// and turns the bitfield incoming from MySQL into a BitBool
func (b *BitBool) Scan(src interface{}) error {
    v, ok := src.([]byte)
    if !ok {
        return errors.New("bad []byte type assertion")
    }
    *b = v[0] == 1
    return nil
}

在提供的 Go 结构体中,Deleted 应声明为:

Deleted     BitBool `form:"-"`

以上是我应该如何将 MySQL 的 `bit(1)` 类型映射到 Go 类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn