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

ไวยากรณ์พารามิเตอร์ชนิดข้อมูล

สร้างฟังก์ชันและชนิดข้อมูลทั่วไปด้วย [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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ไวยากรณ์พารามิเตอร์ชนิดข้อมูล
  2. ข้อจำกัด: comparable และ interface
  3. โครงสร้างข้อมูลทั่วไป
  4. Generics ในทางปฏิบัติ: ข้อควรระวัง
← กลับไปที่ Go Academy