แท็กสำหรับเขตข้อมูลช่วยให้คุณสามารถแนบข้อมูลเมตาไปยังเขตข้อมูลที่สามารถรับได้โดยใช้การสะท้อน โดยปกติจะใช้เพื่อให้ข้อมูลการแปลงว่าฟิลด์ struct ถูกเข้ารหัสไปยังหรือถอดรหัสจากรูปแบบอื่น (หรือจัดเก็บ / ดึงจากฐานข้อมูล) แต่คุณสามารถใช้เพื่อเก็บข้อมูลเมตาใด ๆ ที่คุณต้องการ แพคเกจหรือสำหรับการใช้งานของคุณเอง
ตามที่กล่าวไว้ในเอกสารประกอบของreflect.StructTag
โดยการประชุมค่าของสตริงแท็กเป็นรายการkey:"value"
คู่คั่นด้วยช่องว่างตัวอย่างเช่น:
type User struct {
Name string `json:"name" xml:"name"`
}
key
มักจะหมายถึงแพคเกจที่ตามมา"value"
เป็นเช่นjson
ปุ่มมีการประมวลผล / ใช้โดยencoding/json
แพคเกจ
หากมีการส่งผ่านข้อมูลจำนวนมากใน"value"
โดยทั่วไปจะมีการระบุโดยคั่นด้วยเครื่องหมายจุลภาค ( ','
) เช่น
Name string `json:"name,omitempty" xml:"name"`
มักจะเป็นค่าเส้นประ ( '-'
) สำหรับ"value"
วิธีการที่จะแยกสนามออกจากกระบวนการ (เช่นในกรณีที่json
มันหมายถึงไม่ให้จอมพลหรือ unmarshal ฟิลด์นั้น)
ตัวอย่างการเข้าถึงแท็กที่กำหนดเองโดยใช้การสะท้อน
เราสามารถใช้การสะท้อน ( reflect
แพ็คเกจ) เพื่อเข้าถึงค่าแท็กของเขตข้อมูล struct โดยทั่วไปเราต้องการที่จะได้รับType
ของ struct ของเราและจากนั้นเราสามารถสอบถามสาขาเช่นด้วยหรือType.Field(i int)
Type.FieldByName(name string)
เมธอดเหล่านี้ส่งคืนค่าStructField
ซึ่งอธิบาย / แทนฟิลด์ struct และStructField.Tag
เป็นค่าประเภทStructTag
ที่อธิบาย / แสดงถึงค่าแท็ก
ก่อนหน้านี้เราได้พูดคุยเกี่ยวกับ"การประชุม" อนุสัญญานี้หมายความว่าหากคุณทำตามคุณสามารถใช้StructTag.Get(key string)
วิธีการแยกวิเคราะห์ค่าของแท็กและส่งคืนค่า"value"
ที่key
คุณระบุ ประชุมจะดำเนินการ / สร้างขึ้นในนี้Get()
วิธีการ หากคุณไม่ปฏิบัติตามอนุสัญญาGet()
จะไม่สามารถแยกkey:"value"
คู่และค้นหาสิ่งที่คุณกำลังมองหา นั่นไม่ใช่ปัญหา แต่คุณต้องใช้ตรรกะการแยกวิเคราะห์ของคุณเอง
นอกจากนี้ยังมีStructTag.Lookup()
(ถูกเพิ่มเข้ามาใน Go 1.7) ซึ่งเป็น"เหมือนGet()
แต่แตกต่างแท็กไม่ได้มีคีย์ที่กำหนดจากแท็กเชื่อมโยงสตริงที่ว่างเปล่าที่มีคีย์ที่กำหนด"
ดังนั้นเรามาดูตัวอย่างง่ายๆ:
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"))
}
เอาท์พุท (ลองไปที่สนามเด็กเล่นไป ):
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 มีการนำเสนอเกี่ยวกับแท็ก struct ชื่อ:
แท็กโครงสร้างหลายหน้า (ภาพนิ่ง) (และวิดีโอ )
นี่คือรายการของคีย์แท็กที่ใช้กันทั่วไป: