繁体   English   中英

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

[英]Set tags for imported struct in Go

我正在使用gormg o 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的例子来模仿行为,我得到了相同的结果。

您可以使用bool设置为false来遮蔽该字段,并使用omitempty标记它

例如

type User struct {
    Username  string `json:"username"`
    DeletedAt int    `json:"deleted_at"`
}

type PublicUser struct {
    *User
    DeletedAt bool `json:"deleted_at,omitempty"`
}

随意在这里玩。 另请参阅AttilaOláh的博客文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM