Thẻ cho một trường cho phép bạn đính kèm thông tin meta vào trường có thể thu được bằng phản xạ. Thông thường, nó được sử dụng để cung cấp thông tin chuyển đổi về cách trường cấu trúc được mã hóa hoặc giải mã từ định dạng khác (hoặc được lưu trữ / truy xuất từ cơ sở dữ liệu), nhưng bạn có thể sử dụng nó để lưu trữ bất kỳ thông tin meta nào bạn muốn, hoặc dành cho mục đích khác gói hoặc để sử dụng của riêng bạn.
Như đã đề cập trong tài liệu về reflect.StructTag
, theo quy ước, giá trị của chuỗi thẻ là một danh sách các key:"value"
cặp được phân tách bằng dấu cách , ví dụ:
type User struct {
Name string `json:"name" xml:"name"`
}
Các key
thường biểu thị các gói mà sau này "value"
là dành cho, ví dụ như json
các phím được chế biến / sử dụng bởi các encoding/json
gói.
Nếu nhiều thông tin được truyền vào "value"
, thông thường nó được chỉ định bằng cách tách nó bằng dấu phẩy ( ','
), vd
Name string `json:"name,omitempty" xml:"name"`
Thông thường một giá trị dấu gạch ngang ( '-'
) cho "value"
phương tiện để loại trừ trường khỏi quy trình (ví dụ: trong trường hợp của json
nó có nghĩa là không soái ca hoặc không thống nhất trường đó).
Ví dụ về việc truy cập các thẻ tùy chỉnh của bạn bằng cách sử dụng sự phản chiếu
Chúng ta có thể sử dụng sự phản chiếu ( reflect
gói) để truy cập các giá trị thẻ của các trường cấu trúc. Về cơ bản chúng ta cần có được Type
cấu trúc của chúng ta, và sau đó chúng ta có thể truy vấn các trường, ví dụ như với Type.Field(i int)
hoặc Type.FieldByName(name string)
. Các phương thức này trả về một giá trị trong StructField
đó mô tả / đại diện cho một trường cấu trúc; và StructField.Tag
là một giá trị của loại StructTag
mô tả / đại diện cho một giá trị thẻ.
Trước đây chúng ta đã nói về "quy ước" . Công ước này có nghĩa rằng nếu bạn làm theo nó, bạn có thể sử dụng các StructTag.Get(key string)
phương pháp mà phân tích giá trị của thẻ và trả về cho bạn những "value"
của key
bạn chỉ định. Quy ước được thực hiện / xây dựng theo Get()
phương pháp này . Nếu bạn không tuân theo quy ước, Get()
sẽ không thể phân tích key:"value"
các cặp và tìm thấy những gì bạn đang tìm kiếm. Đó cũng không phải là vấn đề, nhưng sau đó bạn cần thực hiện logic phân tích cú pháp của riêng mình.
Ngoài ra, còn có StructTag.Lookup()
(đã được thêm vào trong Mục 1.7), "giống như Get()
nhưng phân biệt thẻ không chứa khóa đã cho với thẻ liên kết một chuỗi trống với khóa đã cho" .
Vì vậy, hãy xem một ví dụ đơn giản:
type User struct {
Name string `mytag:"MyName"`
Email string `mytag:"MyEmail"`
}
u := User{"Bob", "bob@mycompany.com"}
t := reflect.TypeOf(u)
for _, fieldName := range []string{"Name", "Email"} {
field, found := t.FieldByName(fieldName)
if !found {
continue
}
fmt.Printf("\nField: User.%s\n", fieldName)
fmt.Printf("\tWhole tag value : %q\n", field.Tag)
fmt.Printf("\tValue of 'mytag': %q\n", field.Tag.Get("mytag"))
}
Đầu ra (thử trên Sân chơi Go ):
Field: User.Name
Whole tag value : "mytag:\"MyName\""
Value of 'mytag': "MyName"
Field: User.Email
Whole tag value : "mytag:\"MyEmail\""
Value of 'mytag': "MyEmail"
GopherCon 2015 đã có một bài thuyết trình về các thẻ struct được gọi là:
Nhiều mặt của thẻ cấu trúc (slide) (và video )
Dưới đây là danh sách các khóa thẻ thường được sử dụng:
json
- được sử dụng bởi encoding/json
gói, chi tiết tạijson.Marshal()
xml
- được sử dụng bởi encoding/xml
gói, chi tiết tạixml.Marshal()
bson
- được sử dụng bởi gobson , chi tiết tạibson.Marshal()
protobuf
- được sử dụng bởi github.com/golang/protobuf/proto
, chi tiết trong tài liệu gói
yaml
- được sử dụng bởi gopkg.in/yaml.v2
gói, chi tiết tạiyaml.Marshal()
db
- được sử dụng bởi github.com/jmoiron/sqlx
gói; cũng được sử dụng bởi github.com/go-gorp/gorp
gói
orm
- được sử dụng bởi github.com/astaxie/beego/orm
gói, chi tiết tại Mô hình - Beego ORM
gorm
- được sử dụng bởi github.com/jinzhu/gorm
gói, các ví dụ có thể được tìm thấy trong tài liệu của họ: Mô hình
valid
- được sử dụng bởi github.com/asaskevich/govalidator
gói, các ví dụ có thể được tìm thấy trong trang dự án
datastore
- được sử dụng bởi appengine/datastore
(nền tảng Google App Engine, dịch vụ kho dữ liệu), chi tiết tại Thuộc tính
schema
- được sử dụng github.com/gorilla/schema
để điền vào một struct
giá trị biểu mẫu HTML, được nêu chi tiết trong tài liệu gói
asn
- được sử dụng bởi encoding/asn1
gói, chi tiết tại asn1.Marshal()
vàasn1.Unmarshal()
csv
- được sử dụng bởi github.com/gocarina/gocsv
gói