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