แมป: ที่เก็บคู่คีย์-ค่า
สร้าง อ่าน เขียน และลบรายการในแมป
แมป: ที่เก็บคู่คีย์-ค่า เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
แมปคืออะไร
แมปใน Go คือชุดคู่คีย์กับค่าที่ไม่มีลำดับ คีย์ต้องเป็นชนิดที่เปรียบเทียบได้ (เช่น สตริง จำนวนเต็ม เป็นต้น) แมปเป็นชนิดข้อมูลแบบอ้างอิงที่มีตารางแฮชรองรับ
การสร้างแมป
ใช้ลิเทอรัลหรือ make:
package main
import "fmt"
func main() {
ages := map[string]int{"Alice": 30, "Bob": 25}
cache := make(map[string]string)
fmt.Println(ages, cache)
}การอ่านและการเขียน
เข้าถึงค่าด้วย m[key] และกำหนดค่าด้วย m[key] = value การอ่านคีย์ที่ไม่มีอยู่จะคืนค่าเริ่มต้นของชนิดนั้น:
package main
import "fmt"
func main() {
m := map[string]int{}
m["hits"] = 10
m["hits"]++
fmt.Println(m["hits"]) // 11
fmt.Println(m["missing"]) // 0
}การตรวจสอบว่ามีคีย์อยู่หรือไม่
รูปแบบที่คืนค่าสองค่าช่วยแยกแยะคีย์ที่ไม่มีอยู่จากค่าศูนย์ได้:
package main
import "fmt"
func main() {
m := map[string]int{"a": 0}
v, ok := m["a"]
fmt.Println(v, ok) // 0 true
v2, ok2 := m["z"]
fmt.Println(v2, ok2) // 0 false
}การลบรายการ
ใช้ฟังก์ชันในตัว delete การลบคีย์ที่ไม่มีอยู่จะไม่ทำอะไร:
package main
import "fmt"
func main() {
m := map[string]int{"x": 1, "y": 2}
delete(m, "x")
delete(m, "z") // no-op
fmt.Println(m) // map[y:2]
}การวนซ้ำแมป
ใช้ range เพื่อวนซ้ำ ลำดับไม่รับประกัน:
package main
import "fmt"
func main() {
scores := map[string]int{"Alice": 90, "Bob": 85}
for name, score := range scores {
fmt.Printf("%s: %d\n", name, score)
}
}แมปที่มีค่าเป็นโครงสร้าง
แมปสามารถเก็บโครงสร้างเป็นค่าได้ ให้อัปเดตผ่านตัวแปรชั่วคราว เนื่องจากโครงสร้างในแมปไม่สามารถระบุแอดเดรสได้:
package main
import "fmt"
type Point struct{ X, Y int }
func main() {
points := map[string]Point{"A": {1, 2}}
p := points["A"]
p.X = 99
points["A"] = p
fmt.Println(points["A"]) // {99 2}
}แมป nil
การอ่านแมป nil ให้ผลเหมือนการอ่านแมปว่าง (ได้ค่าเริ่มต้น) แต่การเขียนลงแมป nil จะทำให้เกิด panic:
package main
func main() {
var m map[string]int
_ = m["key"] // ok — returns 0
// m["key"] = 1 // PANIC: assignment to nil map
}แมปไม่ปลอดภัยสำหรับการใช้งานพร้อมกัน
แมปในตัวของ Go ไม่ปลอดภัยสำหรับการใช้งานจาก goroutine พร้อมกัน การอ่านพร้อมกันทำได้ แต่การเขียนพร้อมกัน (หรือการอ่านพร้อมกับการเขียน) ต้องใช้มิวเทกซ์หรือ sync.Map:
package main
import "sync"
func main() {
var mu sync.Mutex
m := map[string]int{}
mu.Lock()
m["key"] = 1
mu.Unlock()
_ = m
}การนับความถี่
รูปแบบการใช้แมปแบบคลาสสิกสำหรับนับจำนวนครั้งที่ปรากฏ:
package main
import "fmt"
func main() {
words := []string{"go", "is", "fast", "go", "is", "go"}
freq := map[string]int{}
for _, w := range words {
freq[w]++
}
fmt.Println(freq) // map[fast:1 go:3 is:2]
}ตรวจสอบความเข้าใจ
จะเกิดอะไรขึ้นเมื่ออ่านคีย์ที่ไม่มีอยู่ในแมปของ Go
สรุป: แมป
ประเด็นสำคัญ:
- แมปเป็นที่เก็บคู่คีย์กับค่าที่ไม่มีลำดับ
- ใช้รูปแบบที่คืนค่าสองค่าเพื่อตรวจสอบว่ามีคีย์อยู่หรือไม่
- อย่าเขียนลงแมป nil
- ลำดับการวนซ้ำเป็นแบบสุ่ม ให้เรียงคีย์หากจำเป็น
- ป้องกันแมปด้วยมิวเทกซ์ในโค้ดที่ทำงานพร้อมกัน
โจทย์ฝึกปฏิบัติ
เขียนฟังก์ชันที่รับสตริงและคืนค่าเป็น map[rune]int ซึ่งนับจำนวนครั้งที่อักขระแต่ละตัวปรากฏ ทดสอบฟังก์ชันด้วยสตริง "hello"
คำถามที่พบบ่อย
บทเรียน “แมป: ที่เก็บคู่คีย์-ค่า” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “แมป: ที่เก็บคู่คีย์-ค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “แมป: ที่เก็บคู่คีย์-ค่า”
สร้าง อ่าน เขียน และลบรายการในแมป คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “แมป: ที่เก็บคู่คีย์-ค่า” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อาร์เรย์: คอลเลกชันความยาวคงที่
- สไลซ์: รายการแบบไดนามิก
- แมป: ที่เก็บคู่คีย์-ค่า
- วนซ้ำคอลเลกชันด้วย range