我想把db连接的结果扫描到一个结构数组中,这个数组也包括一个嵌套的结构数组。但是,当扫描结果并且嵌套数组切片中的值都为零时…切片不会忽略空值。假设数组第二个位置的切片充满了零值。我还有一个 {}
为了那一块。我尝试过创建顶层结构的空切片 Users
但随后抛出一个错误: index[0] out of range
我发现自己成了圈。没有看到任何与这个特定问题相关的东西,我看到了有关嵌套结构的问题,但没有看到嵌套结构数组的问题。有没有人能帮我把切片弄空??
是的,我有 omitempty
在我的结构标签中。
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
)
type User struct {
Id int64 `json:",omitempty"`
Username string `json:",omitempty"`
Email string `json:",omitempty"`
Profile []*Profile `json:",omitempty"`
}
type Profile struct {
Id int64 `json:",omitempty"`
UserId int64 `json:",omitempty"`
Firstname *string `json:",omitempty"`
Lastname *string `json:",omitempty"`
}
var DB *sql.DB
func checkErr(err error, msg string) {
if err != nil {
log.Fatal(msg, err)
}
}
func main() {
DB, _ = sql.Open("mysql", "username:secrect@/database")
defer DB.Close()
}
func GetUsers() {
stmt, err := DB.Query("Select users.id, username , email , firstname AS firstName1 , lastname AS lastName1, firstname AS firstName2 , lastname AS lastName2 from users left join profiles on users.id = profiles.user_id ")
if err != nil {
panic(err.Error())
}
defer stmt.Close()
users := []User{}
for stmt.Next() {
user := User{Profile: Profile{{}}}
err := stmt.Scan(&user.Id, &user.Username, &user.Email, &user.Profile[0].Firstname, &user.Profile[0].Lastname, &user.Profile[1].Firstname, &user.Profile[1].Lastname)
if err != nil {
panic(err.Error())
}
users = append(users, user)
}
}
1条答案
按热度按时间eiee3dmh1#
您正在尝试将基于行的sql查询的结果集加载到不基于行的多级数据结构中。您可以处理连接的结果集并填写结构,也可以执行两个查询,一个用于获取
User
另一个去拿Profile
与之相关的。您的结果集将为每个用户包含多个行,因此您必须处理结果并基于您获取的结果构造结构。这样的方法应该有用:
您提到的json标记只适用于json封送/解封送。它们与数据库操作无关。