2015-11-01 122 views
4

我試圖存儲SQL查詢的數據集在一個JSON結構和顯示。我已經差不多完成了。現在的問題是嵌套結構的結果集是空的,我不想顯示它。Golang:在嵌套結構存儲SQL結果集和省略,如果空

同樣的問題specified here但使用指針在恐慌掃描,因爲我使用&user.Profile.Firstname

2015/11/01 16:42:16 Panic recovery -> runtime error: invalid memory address or nil pointer dereference

可能是當如果我刪除的指針則一切正常只是空場仍然結束。我很困惑如何實現這一點。

package main 

import (
    "database/sql" 
    "github.com/gin-gonic/gin" 
    _ "github.com/go-sql-driver/mysql" 
    "log" 
) 

type User struct { 
    Id  int64 
    Username string 
    Email string 
    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:[email protected]/database") 
    defer DB.Close() 

    r := gin.Default() 
    v1 := r.Group("api/v1/") 
    { 
     v1.GET("users", GetUsers) 
    } 
    r.Run(":8080") 
} 


func GetUsers(c *gin.Context) { 
    stmt, err := DB.Query("Select users.id, username , email , firstname , lastname 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() { 
     var user User 
     err := stmt.Scan(&user.Id, &user.Username, &user.Email, &user.Profile.Firstname, &user.Profile.Lastname) 
     if err != nil { 
      panic(err.Error()) 
     } 

     users = append(users, user) 
    } 

    c.JSON(200, &users) 
} 

輸出:

{ 
    "Id": 1, 
    "Username": "test1", 
    "Email": "[email protected]", 
    "Profile": { 
    "Firstname": "John", 
    "Lastname": "Doe" 
    } 
}, 
{ 
    "Id": 2, 
    "Username": "test2", 
    "Email": "[email protected]", 
    "Profile": { 
    } 
}, 

回答

0

假設gin使用encoding/json被窩裏,如果你想省略空Profile,我相信你需要它是在User指針:

type User struct { 
    .... 
    Profile *Profile `json:",omitempty"` 
} 

注意documentation

The "omitempty" option specifies that the field should be omitted from the encoding if the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, slice, map, or string.

它並不是說將檢測到結構的零值。

,將讓你的一些問題從DB掃描您的數據。你可以聲明Profile,掃描進去,比較零配置文件並將其分配給User如果有數據:

var user User 
var profile Profile 
_ = stmt.Scan(&user.Id, &user.Username, &user.Email, &profile.Firstname, &profile.Lastname) 
if profile != Profile{} { 
    user.Profile = &profile 
} 

我懷疑是不是最完美的解決方案,但我希望這是正確的方向。