Bài học theo mô-đun (4/5)
Thẻ trường và JSON
Thẻ trên trường cấu trúc là chuỗi siêu dữ liệu, được đọc qua phản chiếu
bởi các thư viện như encoding/json, encoding/xml, trình xác thực, ORM. Họ
được viết giữa backticks (chuỗi thô) ngay sau loại trường.
Cú pháp
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
}Quy ước định dạng: key:"value" phân tách bằng dấu cách (KHÔNG
dấu phẩy) cho nhiều khóa:
type User struct {
Email string `json:"email" validate:"required,email"`
}thẻ json: tùy chọn
Tùy chọn phổ biến nhất là json, được sử dụng bởi encoding/json:
| Gắn thẻ | Hiệu ứng |
|---|---|
json:"nome" | Đổi tên trường thành nome trong đầu ra JSON |
json:"nome,omitempty" | Bỏ qua trường nếu nó ở giá trị 0 |
json:"-" | Không tuần tự hóa/giải tuần tự hóa trường này |
json:",omitempty" | Giữ tên trường Go nhưng có omitempty |
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
Password string `json:"-"`
}
u := User{Name: "Ada", Age: 0, Password: "segreto"}
b, _ := json.Marshal(u)
fmt.Println(string(b)) // {"nome":"Ada"}Age bị bỏ qua (giá trị 0 0 + omitempty); Password là
bị loại trừ hoàn toàn.
Nguyên soái và Không nguyên soái
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal chỉ chấp nhận một con trỏ vì nó phải ghi vào
các trường giá trị.
Các thẻ phổ biến khác
xml:"..."—encoding/xmlyaml:"..."— yaml.v3db:"..."— sqlx / pgxvalidate:"..."— sân chơi/trình xác thựcform:"..."— liên kết gin / echo
Thư viện đọc chúng thông qua phản ánh (reflect.StructTag.Get("json")):
chúng chỉ là những chuỗi cho đến khi có ai đó giải thích chúng.
Hãy thử nó
Thêm thẻ json:"nome" vào trường Tên và thẻ json:"eta" vào trường Tuổi.
Hiển thị gợi ý
Thẻ là các chuỗi thô giữa các dấu backticks ngay sau loại trường.
Giải pháp khả dụng sau 3 lần thử
Thêm tùy chọn thiếu sót vào trường Tuổi: nó phải được bỏ qua khi nó bằng 0.
Hiển thị gợi ý
Các tùy chọn nằm sau tên, được phân tách bằng dấu phẩy: json:"nome,omitempty".
Giải pháp khả dụng sau 3 lần thử
Nó in gì với thẻ json:"nome" và json:"eta"?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))Tóm tắt lại
- Thẻ là các chuỗi thô giữa các dấu backticks:
`key:"value" key2:"value2"`. json:"nome": rename.omitempty: omit if zero value.-: exclude.- NON-exported (lowercase) fields are ignored by
encoding/json. json.Marshal(v)↔json.Unmarshal(data, &v)(pointer).- Same mechanism for
xml,yaml,db,validate,biểu mẫu, …