ไวยากรณ์พารามิเตอร์ชนิดข้อมูล
สร้างฟังก์ชันและชนิดข้อมูลทั่วไปด้วย [T any]
ไวยากรณ์พารามิเตอร์ชนิดข้อมูล เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
เบื้องหลังของเจเนริก
ก่อน Go 1.18 โค้ดที่ทำงานกับหลายชนิดข้อมูลจำเป็นต้องใช้ interface{}/any ซึ่งทำให้ความปลอดภัยของชนิดข้อมูลหายไป หรือใช้การสร้างโค้ด เจเนริกเพิ่มพารามิเตอร์ชนิดข้อมูลเพื่อให้เกิดพหุรูปแบบขณะคอมไพล์
ไวยากรณ์ฟังก์ชันเจเนริก
ประกาศพารามิเตอร์ชนิดข้อมูลในวงเล็บเหลี่ยมหลังชื่อฟังก์ชัน:
func Map[T, U any](s []T, f func(T) U) []U {
result := make([]U, len(s))
for i, v := range s {
result[i] = f(v)
}
return result
}
nums := Map([]int{1,2,3}, func(n int) string {
return strconv.Itoa(n)
})การอนุมานชนิดข้อมูล
คอมไพเลอร์จะอนุมานอาร์กิวเมนต์ชนิดข้อมูลจากอาร์กิวเมนต์ของฟังก์ชันในกรณีส่วนใหญ่ คุณสามารถระบุอาร์กิวเมนต์เหล่านั้นอย่างชัดเจนได้หากการอนุมานไม่สำเร็จ
// Inferred:
nums := Map([]int{1,2,3}, strconv.Itoa)
// Explicit:
nums := Map[int, string]([]int{1,2,3}, strconv.Itoa)ชนิดข้อมูลเจเนริก
สตรักต์และชนิดข้อมูลอื่น ๆ ก็สามารถมีพารามิเตอร์ชนิดข้อมูลได้เช่นกัน:
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(v T) { s.items = append(s.items, v) }
func (s *Stack[T]) Pop() (T, bool) {
if len(s.items) == 0 { var zero T; return zero, false }
n := len(s.items)-1
v := s.items[n]
s.items = s.items[:n]
return v, true
}พารามิเตอร์ชนิดข้อมูลหลายตัว
ฟังก์ชันและชนิดข้อมูลสามารถมีพารามิเตอร์ชนิดข้อมูลหลายตัวได้:
type Pair[K, V any] struct { Key K; Value V }
func Zip[K, V any](keys []K, vals []V) []Pair[K, V] {
result := make([]Pair[K, V], min(len(keys), len(vals)))
for i := range result {
result[i] = Pair[K, V]{keys[i], vals[i]}
}
return result
}ค่าศูนย์ของพารามิเตอร์ชนิดข้อมูล
ประกาศตัวแปรที่มีค่าศูนย์ด้วย var zero T ซึ่งจำเป็นเมื่อต้องส่งคืนผลลัพธ์ "ไม่มีค่า" จากฟังก์ชันเจเนริก
func First[T any](s []T) (T, bool) {
if len(s) == 0 { var zero T; return zero, false }
return s[0], true
}เมธอดบนชนิดข้อมูลเจเนริก
เมธอดบนชนิดข้อมูลเจเนริกใช้พารามิเตอร์ของชนิดข้อมูลนั้น ไม่ใช่พารามิเตอร์ของเมธอดเอง เมธอดไม่สามารถเพิ่มพารามิเตอร์ชนิดข้อมูลได้
type Pair[K, V any] struct{ K K; V V }
func (p Pair[K, V]) Swap() Pair[V, K] { return Pair[V, K]{p.V, p.K} }การสร้างอินสแตนซ์
การใช้ชนิดข้อมูลเจเนริกร่วมกับอาร์กิวเมนต์ชนิดข้อมูลที่เป็นรูปธรรมเรียกว่าการสร้างอินสแตนซ์ การดำเนินการนี้เกิดขึ้นขณะคอมไพล์ ไม่ใช่ขณะรันไทม์ จึงไม่มีต้นทุนจากการห่อหุ้มค่า
s := Stack[int]{}
s.Push(42)นามแฝงชนิดข้อมูลและชนิดข้อมูลเจเนริก
คุณสามารถสร้างนามแฝงชนิดข้อมูลสำหรับชนิดข้อมูลเจเนริกที่สร้างอินสแตนซ์แล้วได้:
type IntStack = Stack[int]ข้อจำกัด
ไม่สามารถใช้พารามิเตอร์ชนิดข้อมูลกับสวิตช์ชนิดข้อมูลหรือการตรวจสอบชนิดข้อมูลได้ เมธอดบนชนิดข้อมูลเจเนริกไม่สามารถมีพารามิเตอร์ชนิดข้อมูลเพิ่มเติม เจเนริกไม่สามารถใช้กับชนิดข้อมูลที่โอเปอเรเตอร์ถูกโอเวอร์โหลดได้หากไม่มีข้อจำกัด
ควรใช้เจเนริกเมื่อใด
ใช้เจเนริกกับอัลกอริทึมที่ไม่ขึ้นกับชนิดข้อมูลอย่างแท้จริง เช่น ชนิดข้อมูลคอนเทนเนอร์และตัวช่วยเชิงฟังก์ชันอย่าง Map/Filter/Reduce เมื่อทางเลือกอื่นต้องทำให้โค้ดซ้ำหรือใช้การแปลงชนิดข้อมูลที่ไม่ปลอดภัย
ตรวจสอบความเข้าใจ
พารามิเตอร์ชนิดข้อมูลประกาศไว้ที่ใดในฟังก์ชันเจเนริก
สรุป: ไวยากรณ์พารามิเตอร์ชนิดข้อมูล
ประเด็นสำคัญ:
- พารามิเตอร์ชนิดข้อมูลอยู่ในวงเล็บเหลี่ยม: func Foo[T any](...)
- ใช้ได้กับฟังก์ชันและชนิดข้อมูล เช่น สตรักต์
- คอมไพเลอร์อนุมานอาร์กิวเมนต์ชนิดข้อมูลจากอาร์กิวเมนต์ได้ในกรณีส่วนใหญ่
- ค่าศูนย์: var zero T; ไม่มีพารามิเตอร์ชนิดข้อมูลระดับเมธอด
คำถามที่พบบ่อย
บทเรียน “ไวยากรณ์พารามิเตอร์ชนิดข้อมูล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ไวยากรณ์พารามิเตอร์ชนิดข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ไวยากรณ์พารามิเตอร์ชนิดข้อมูล”
สร้างฟังก์ชันและชนิดข้อมูลทั่วไปด้วย [T any] คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ไวยากรณ์พารามิเตอร์ชนิดข้อมูล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ไวยากรณ์พารามิเตอร์ชนิดข้อมูล
- ข้อจำกัด: comparable และ interface
- โครงสร้างข้อมูลทั่วไป
- Generics ในทางปฏิบัติ: ข้อควรระวัง