如何使用Scan接口来小写从数据库读取的字符串

时间:2013-12-14 07:19:04

标签: go

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

当使用Scan接口从db读取时,

类型EmailAddress应始终为小写,这会引发恐慌:接口转换:接口是[] 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)
  }
}

1 个答案:

答案 0 :(得分:10)

您看到[]uint8错误,因为EmailAddress是作为字节切片提供的,而不是字符串。请记住,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
}