在用golang获取数据库的数据的时候,难免会遇到可控field。这个时候拿到的数据如果直接用`string`, `time.Time`这样的类型来解析的话会遇到panic。
那么如何处理这个问题呢,第一个出现在眼前的办法就是用`database/sql`。这个包里包含了很多的可以处理可控字段的类型,比如:`sql.NullString`, `sql.NullBool`等。所以,model可以用这些类型来定义,如:
```go
package main
import (
"database/sql"
"fmt"
)
type Article struct {
Id int `json:"id"`
Title string `json:"title"`
PubDate mysql.NullTime `json:"pub_date"`
Body sql.NullString `json:"body"`
User sql.NullInt64 `json:"user"`
}
```
这样的定义是可以work的,但是会有一点奇怪:没谁会用数据库的类型来代替平时的类型。所以,我们可以改一种思路。在解析数据库的时候会有专用的数据库类型字段来接收,但是在返回json的时候有专门的model来使用,这个model用的是普通的类型。
所以,写起来是这样的:
```go
var person Person
var personID int64
var password sql.NullString
var lastLogin mysql.NullTime
var isSuperuser sql.NullBool
var userName sql.NullString
var firstName sql.NullString
var lastName sql.NullString
var email sql.NullString
var isStaff sql.NullBool
var isActive sql.NullBool
var dateJoined mysql.NullTime
err = ret.Scan(
&personID,
&password,
&lastLogin,
&isSuperuser,
&userName,
&firstName,
&lastName,
&a