แท็กสำหรับเขตข้อมูลช่วยให้คุณสามารถแนบข้อมูลเมตาไปยังเขตข้อมูลที่สามารถรับได้โดยใช้การสะท้อน โดยปกติจะใช้เพื่อให้ข้อมูลการแปลงว่าฟิลด์ 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 ชื่อ:
แท็กโครงสร้างหลายหน้า (ภาพนิ่ง) (และวิดีโอ )
นี่คือรายการของคีย์แท็กที่ใช้กันทั่วไป: