参考链接
github.com/jtao539/sqlxp // 我同学写的,本人没那个能力
代码
package main
import (
"database/sql"
"fmt"
"github.com/jtao539/sqlxp"
)
// 字段名需大写
// User中的tag必须添加
type AnimalNULL struct {
Name sql.NullString
Sex sql.NullBool
}
type Animal struct {
Name string
Sex bool
}
type UserNULL struct {
Name sql.NullString `db:"name" json:"name"`
Sex sql.NullInt64 `db:"sex" json:"sex"`
Password sql.NullString `db:"password" json:"password"`
High sql.NullFloat64 `db:"high" json:"high"`
A AnimalNULL // 不能只写AnimalNULL,否则报错(局限性)
}
type User struct {
Name string `db:"name" json:"name"`
Sex int `db:"sex" json:"sex"`
Password string `db:"password" json:"password"`
High float64 `db:"high" json:"high"`
A Animal
}
func IntToNullInt64(a int) sql.NullInt64 {
return sql.NullInt64{Int64: int64(a), Valid: true}
}
func StringToNullString(a string) sql.NullString {
return sql.NullString{String: a, Valid: true}
}
func main() {
// sqlxp.N2B
usex := IntToNullInt64(1)
uname := StringToNullString("tom")
upassword := StringToNullString("123456")
high := sql.NullFloat64{170.82, true}
uNUll := UserNULL{
uname,
usex,
upassword,
high,
AnimalNULL{
StringToNullString("cat"),
sql.NullBool{true, true},
},
}
var u User
// 如果前后字段类型不一致,则会跳过,例如在UserNULL中sex的类型为sql.NullInt64,在User中sex的类型为string
sqlxp.N2B(uNUll, &u) // {tom 123456}
fmt.Println(u)
// tags表示要跳过的字段,此处跳过password
var u2 User
sqlxp.N2B(uNUll, &u2, "password")
fmt.Println(u2) // {tom 1 }
// sqlxp.B2N
var n UserNULL
sqlxp.B2N(u, &n)
fmt.Println(n) // {{tom true} {1 true} {123456 true}}
// sqlxp.N2BList
usex2 := IntToNullInt64(2)
uname2 := StringToNullString("jack")
upassword2 := StringToNullString("123456")
high2 := sql.NullFloat64{172.82, true}
uNull2 := UserNULL{
uname2,
usex2,
upassword2,
high2,
AnimalNULL{
StringToNullString("dog"),
sql.NullBool{true, true},
},
}
var s1 []UserNULL
s1 = append(s1, uNUll, uNull2)
t := make([]User, len(s1))
sqlxp.N2BList(s1, t)
fmt.Println(t)
//fmt.Printf("%#v\n", reflect.TypeOf(t))
// sqlxp.B2NList
u3 := User{"张三", 1, "123", 173.53, Animal{"老虎", true}}
u4 := User{"李四", 1, "456", 175.65, Animal{"狮子", true}}
var entity []User
entity = append(entity, u3, u4)
nullentity := make([]UserNULL, len(entity))
sqlxp.B2NList(entity, nullentity)
fmt.Println(nullentity)
}
运行结果