gpt4 book ai didi

go - 如何使用 Scan 接口(interface)将从数据库中读取的字符串小写

转载 作者:IT王子 更新时间:2023-10-29 00:36:27 26 4
gpt4 key购买 nike

我想在从数据库读取字符串时将其小写。我知道这可以在 SQL 中完成,但这是我使用 go 的第一天,这更像是一个概念证明(和对 go 的理解),而不是实际需求。

使用 Scan 接口(interface)从数据库中读取时,类型 EmailAddress 应始终为小写,这会因 panic 而中断:接口(interface)转换:接口(interface)是 []uint8,而不是字符串

package main

import (
"database/sql"
"github.com/kisielk/sqlstruct"
_ "github.com/lib/pq"
"log"
"strings"
)

type EmailAddress string

func (g *EmailAddress) Scan(src interface{}) error {
*g = EmailAddress(strings.ToLower(src.(string)))
return nil
}

type User struct {
Id int
MobilePhone string `sql:"mobile_phone"`
Email EmailAddress
}

func main() {
db, _ := sql.Open("postgres", "host=localhost dbname=test sslmode=disable")
defer db.Close()

rows, _ := db.Query("SELECT id, mobile_phone, COALESCE(email,'') as email FROM users limit 5")

for rows.Next() {
var t User
_ = sqlstruct.Scan(&t, rows)
log.Printf("%+v\n", t)
}
}

最佳答案

您看到了 []uint8 错误,因为 EmailAddress 是作为 byte slice 而不是字符串提供的。请记住,byte 只是 uint8 的别名。这是一个简单的示例,显示了您看到的错误:http://play.golang.org/p/iN5y3PaFAL

因此,最简单的解决方法是更改​​扫描功能:

func (g *EmailAddress) Scan(src interface{}) error {
b, ok := src.([]byte)
if !ok {
return fmt.Errorf("expected []byte, got %T", src)
}
*g = EmailAddress(strings.ToLower(string(b))
return nil
}

关于go - 如何使用 Scan 接口(interface)将从数据库中读取的字符串小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20580746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com