0Pricing
Go Academy · บทเรียน

การแยกวิเคราะห์แท็กแบบกำหนดเอง

อ่านแท็กผ่านการสะท้อน

การแยกวิเคราะห์แท็กแบบกำหนดเอง เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

การอ่านแท็กด้วยตนเอง

คุณสามารถกำหนดคีย์แท็กของตนเองและอ่านคีย์เหล่านั้นขณะทำงานด้วยแพ็กเกจ reflect วิธีนี้ช่วยให้คุณสร้างพฤติกรรมแบบกำหนดเองที่ขับเคลื่อนด้วยข้อมูลกำกับ

reflect.TypeOf

reflect.TypeOf คืนค่าชนิดที่อธิบายค่าใดค่าหนึ่ง จากชนิดของโครงสร้าง คุณสามารถตรวจสอบฟิลด์ของโครงสร้างได้

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
}

func main() {
	t := reflect.TypeOf(User{})
	fmt.Println(t.Kind(), t.NumField())
}

การวนดูฟิลด์

NumField และ Field(i) ช่วยให้คุณวนดูฟิลด์ทุกฟิลด์ของชนิดโครงสร้างได้

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
	Age  int
}

func main() {
	t := reflect.TypeOf(User{})
	for i := 0; i < t.NumField(); i++ {
		fmt.Println(t.Field(i).Name)
	}
}

การเข้าถึงแท็กของฟิลด์

แต่ละฟิลด์มี Tag ชนิด reflect.StructTag เรียกใช้ .Get(key) เพื่ออ่านค่าของแท็กที่ระบุ

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string "label:\"Full Name\""
}

func main() {
	f := reflect.TypeOf(User{}).Field(0)
	fmt.Println(f.Tag.Get("label"))
}

การกำหนดแท็กแบบกำหนดเอง

คุณสามารถสร้างคีย์แท็กใดก็ได้ ในที่นี้แท็กแบบกำหนดเอง label ใช้อธิบายชื่อที่อ่านเข้าใจง่ายสำหรับแต่ละฟิลด์

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email Address\""
	City  string "label:\"City\""
}

func main() {
	t := reflect.TypeOf(Form{})
	for i := 0; i < t.NumField(); i++ {
		f := t.Field(i)
		fmt.Println(f.Name, "->", f.Tag.Get("label"))
	}
}

Tag.Lookup สำหรับแท็กที่ไม่บังคับ

Tag.Lookup(key) คืนค่าค่าและค่าบูลีนหนึ่งค่า ใช้เมธอดนี้เพื่อจัดการกับฟิลด์ที่อาจไม่มีแท็กของคุณ

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email\""
	Token string
}

func main() {
	t := reflect.TypeOf(Form{})
	for i := 0; i < t.NumField(); i++ {
		v, ok := t.Field(i).Tag.Lookup("label")
		fmt.Println(t.Field(i).Name, v, ok)
	}
}

การอ่านค่าของฟิลด์ด้วย

ใช้ reflect.ValueOf ร่วมกับชนิดของข้อมูลเพื่ออ่านทั้งแท็กและค่าปัจจุบันของแต่ละฟิลด์

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email\""
}

func main() {
	f := Form{Email: "a@b.com"}
	t := reflect.TypeOf(f)
	v := reflect.ValueOf(f)
	fmt.Println(t.Field(0).Tag.Get("label"), "=", v.Field(0))
}

การแยกวิเคราะห์ตัวเลือกของแท็ก

หากค่าแท็กของคุณรวมตัวเลือกไว้ด้วยกัน (เช่น name,opt) ให้แยกค่าเองด้วย strings.Split โดยใช้จุลภาคเป็นตัวคั่น

package main

import (
	"fmt"
	"strings"
)

func main() {
	tag := "name,omitempty"
	parts := strings.Split(tag, ",")
	fmt.Println("name:", parts[0], "opts:", parts[1:])
}

กรณีใช้งานขนาดเล็ก

เมื่อนำทุกอย่างมารวมกัน คุณสามารถสร้างแมปป้ายกำกับอย่างง่ายจากโครงสร้าง ซึ่งชั้นติดต่อผู้ใช้สามารถนำไปใช้แสดงป้ายกำกับของแบบฟอร์มได้

package main

import (
	"fmt"
	"reflect"
)

type Profile struct {
	Name string "label:\"Your Name\""
	Bio  string "label:\"About You\""
}

func main() {
	t := reflect.TypeOf(Profile{})
	labels := map[string]string{}
	for i := 0; i < t.NumField(); i++ {
		f := t.Field(i)
		labels[f.Name] = f.Tag.Get("label")
	}
	fmt.Println(labels)
}

ต้นทุนของรีเฟลกชัน

รีเฟลกชันมีประสิทธิภาพมาก แต่ช้ากว่าโค้ดโดยตรงและข้ามการตรวจสอบระหว่างการคอมไพล์ ควรใช้กับฟีเจอร์ลักษณะเฟรมเวิร์ก ไม่ใช่ในลูปที่ทำงานบ่อย

พอยน์เตอร์และ reflect

หากคุณมีพอยน์เตอร์ ให้เรียกใช้ reflect.TypeOf(v).Elem() เพื่อเข้าถึงชนิดโครงสร้างที่อยู่ภายในก่อนตรวจสอบฟิลด์

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string "label:\"Name\""
}

func main() {
	u := &User{}
	t := reflect.TypeOf(u).Elem()
	fmt.Println(t.Field(0).Tag.Get("label"))
}

ตรวจสอบอย่างรวดเร็ว

เมธอดใดใช้สำหรับอ่านค่าของคีย์แท็กแบบกำหนดเองจากฟิลด์ของโครงสร้างที่ได้มาผ่านรีเฟลกชัน

สรุปทบทวน

การแยกวิเคราะห์แท็กแบบกำหนดเอง:

  • ใช้ reflect.TypeOf และวนดูฟิลด์
  • field.Tag.Get / Lookup ใช้อ่านค่าแท็ก
  • แยกค่าเพื่อวิเคราะห์ตัวเลือก
  • มีประสิทธิภาพมากแต่ช้ากว่า ควรใช้กับฟีเจอร์ของเฟรมเวิร์ก

คำถามที่พบบ่อย

บทเรียน “การแยกวิเคราะห์แท็กแบบกำหนดเอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแยกวิเคราะห์แท็กแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแยกวิเคราะห์แท็กแบบกำหนดเอง”

อ่านแท็กผ่านการสะท้อน คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การแยกวิเคราะห์แท็กแบบกำหนดเอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แท็กสตรักต์คืออะไร
  2. แท็ก JSON
  3. ไลบรารีตรวจสอบความถูกต้อง
  4. การแยกวิเคราะห์แท็กแบบกำหนดเอง
← กลับไปที่ Go Academy