猿问

在 Go 中为导入的结构设置标签

我使用的格姆(g ^ ō ORM)来检索从我的数据库将在JSON编码数据。Gorm 为主键和时间跟踪提供了一个默认结构,其 DeletedAt 属性不应在 JSON 中编码。


我写了一个小例子,它不输出密码,但 DeletedAt 属性仍然可见。


package main


import (

    "encoding/json"

    "fmt"

    "os"


    "github.com/jinzhu/gorm"

    _ "github.com/lib/pq"

    _ "github.com/mattn/go-sqlite3"

)


// Struct from the gorm package:

//

// type Model struct {

//     ID        uint `gorm:"primary_key"`

//     CreatedAt time.Time

//     UpdatedAt time.Time

//     DeletedAt *time.Time

// }


// Defines the database model for gorn

type User struct {

    gorm.Model

    Username string `json:"username" sql:"size:32; not null; unique"`

    Password string `json:"password" sql:"not null"`

    Locale   string `json:"locale"   sql:"not null"`

}


// Public JSON version of database model

type PublicUser struct {

    *User

    DeletedAt bool `json:"deletedAt,omitempty"`

    Password  bool `json:"password,omitempty"`

}


func main() {

    db, err := gorm.Open("sqlite3", "storage.db")


    if err != nil {

        fmt.Println(err)

    }


    u := &User{}

    db.Where("id = ?", 3).Find(&u)


    json.NewEncoder(os.Stdout).Encode(PublicUser{

        User: u,

    })

}

如果我运行我的脚本,这是我得到的输出:


{

    "ID":3,

    "CreatedAt":"2015-05-13T14:54:23.5577227Z",

    "UpdatedAt":"2015-05-13T14:54:23.5577227Z",

    "DeletedAt":null,

    "username":"dan",

    "locale":"en_US"

}

我修改了Alfred Rossi的例子来模仿行为,我得到了相同的结果。


犯罪嫌疑人X
浏览 161回答 1
1回答

米琪卡哇伊

您可以使用设置为 false 的 bool 来遮蔽该字段并使用 omitempty例如type User struct {    Username  string `json:"username"`    DeletedAt int    `json:"deleted_at"`}type PublicUser struct {    *User    DeletedAt bool `json:"deleted_at,omitempty"`}
随时随地看视频慕课网APP

相关分类

Go
我要回答