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

โครงสร้างข้อมูลทั่วไป

สร้าง Stack และ Set แบบทั่วไป

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

เหตุใดจึงต้องใช้โครงสร้างข้อมูลเจเนอริก

ก่อนมีเจเนอริก นักพัฒนา Go ใช้สไลซ์ interface{} (ทำให้สูญเสียความปลอดภัยของชนิด) หรือสร้างโค้ดแยกสำหรับแต่ละชนิด เจเนอริกช่วยให้สร้างคอนเทนเนอร์ที่นำกลับมาใช้ใหม่ได้และปลอดภัยด้านชนิด

สแตกเจเนอริก

สแตกที่ปลอดภัยด้านชนิดโดยใช้ชนิดเจเนอริก:

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 z T; return z, false }
    n := len(s.items)-1; v := s.items[n]; s.items = s.items[:n]; return v, true
}
func (s *Stack[T]) Len() int { return len(s.items) }

คิวเจเนอริก

คิวแบบ FIFO ที่มีสไลซ์รองรับ:

type Queue[T any] struct{ items []T }
func (q *Queue[T]) Enqueue(v T)     { q.items = append(q.items, v) }
func (q *Queue[T]) Dequeue() (T, bool) {
    if len(q.items)==0 { var z T; return z, false }
    v := q.items[0]; q.items = q.items[1:]; return v, true
}

เซตเจเนอริก

เซตที่มีแผนที่รองรับ — ชนิดคีย์ต้องสามารถเปรียบเทียบได้:

type Set[T comparable] struct{ m map[T]struct{} }
func NewSet[T comparable]() *Set[T] { return &Set[T]{m: make(map[T]struct{})} }
func (s *Set[T]) Add(v T)          { s.m[v] = struct{}{} }
func (s *Set[T]) Has(v T) bool     { _, ok := s.m[v]; return ok }
func (s *Set[T]) Delete(v T)       { delete(s.m, v) }

ตัวช่วย Map แบบเจเนอริก

Map เชิงฟังก์ชันที่ปลอดภัยด้านชนิดสำหรับสไลซ์:

func Map[T, U any](s []T, f func(T) U) []U {
    out := make([]U, len(s))
    for i, v := range s { out[i] = f(v) }
    return out
}

ตัวช่วย Filter แบบเจเนอริก

ส่งคืนสไลซ์ใหม่ที่มีเฉพาะสมาชิกซึ่งตรงตามเงื่อนไข:

func Filter[T any](s []T, predicate func(T) bool) []T {
    var out []T
    for _, v := range s {
        if predicate(v) { out = append(out, v) }
    }
    return out
}

ตัวช่วย Reduce แบบเจเนอริก

รวมสไลซ์ให้กลายเป็นค่าเดียว:

func Reduce[T, U any](s []T, init U, f func(U, T) U) U {
    acc := init
    for _, v := range s { acc = f(acc, v) }
    return acc
}

OrderedMap

แผนที่ที่รักษาลำดับการเพิ่มข้อมูลไว้ — มีประโยชน์สำหรับการทำให้การแปลงเป็น JSON มีลำดับคีย์ที่คงที่:

type OrderedMap[K comparable, V any] struct {
    keys []K
    vals map[K]V
}

รายการเชื่อมโยงแบบเจเนอริก

รายการเชื่อมโยงสองทางที่สมาชิกปลอดภัยด้านชนิด:

type Node[T any] struct{ Val T; Next, Prev *Node[T] }
type List[T any] struct{ head, tail *Node[T]; len int }

ข้อจำกัด

ชนิดเจเนอริกไม่สามารถใช้การสลับชนิดกับ T ได้ เมธอดของชนิดเจเนอริกไม่สามารถเพิ่มพารามิเตอร์ชนิดใหม่ได้ และไม่สามารถทำให้ชนิดเจเนอริกเฉพาะเจาะจงสำหรับ T ใด T หนึ่งได้ (ไม่มีการทำให้แม่แบบเฉพาะเจาะจง)

ประสิทธิภาพ

การสร้างอินสแตนซ์เจเนอริกใน Go ใช้ «รูปร่าง GC» — ชนิดที่มีโครงร่างหน่วยความจำเหมือนกันจะแชร์การทำงานเดียวกัน วิธีนี้หลีกเลี่ยงการทำให้โค้ดมีขนาดใหญ่ขึ้น พร้อมรักษาประสิทธิภาพให้ใกล้เคียงกับการใช้งานชนิดที่เป็นรูปธรรม

เมื่อใดไม่ควรใช้เจเนอริก

หลีกเลี่ยงเจเนอริกในกรณีง่าย ๆ ที่ใช้อินเทอร์เฟซก็เพียงพอ หรือเมื่อมีชนิดที่เป็นรูปธรรมเพียงหนึ่งหรือสองชนิด เพราะความซับซ้อนที่เพิ่มขึ้นไม่คุ้มกับประโยชน์ที่ได้รับ

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

เหตุใดเซตเจเนอริกจึงต้องกำหนดข้อจำกัด comparable ให้กับพารามิเตอร์ชนิด

สรุป: โครงสร้างข้อมูลเจเนอริก

ประเด็นสำคัญ:

  • สแตก คิว และเซต — ปลอดภัยด้านชนิดด้วยเจเนอริก
  • ตัวช่วยเชิงฟังก์ชัน: Map, Filter และ Reduce สำหรับ []T
  • Set[T comparable] สำหรับเซตที่มีแผนที่รองรับ
  • ไม่มีพารามิเตอร์ชนิดระดับเมธอด และไม่มีการทำให้แม่แบบเฉพาะเจาะจง

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

บทเรียน “โครงสร้างข้อมูลทั่วไป” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “โครงสร้างข้อมูลทั่วไป”

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

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

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

บทเรียน “โครงสร้างข้อมูลทั่วไป” ใช้เวลานานแค่ไหน

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

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

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

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

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