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

แมป: ที่เก็บคู่คีย์-ค่า

สร้าง อ่าน เขียน และลบรายการในแมป

แมป: ที่เก็บคู่คีย์-ค่า เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. อาร์เรย์: คอลเลกชันความยาวคงที่
  2. สไลซ์: รายการแบบไดนามิก
  3. แมป: ที่เก็บคู่คีย์-ค่า
  4. วนซ้ำคอลเลกชันด้วย range
← กลับไปที่ Go Academy