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

sync.Once และ sync.Map

การเริ่มต้นเพียงครั้งเดียวและแมปพร้อมกัน

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

sync.Once

sync.Once รับประกันว่าฟังก์ชันจะทำงานเพียงครั้งเดียว ไม่ว่าจะมีโกโรทีนกี่ตัวเรียกฟังก์ชันนั้นพร้อมกัน กรณีการใช้งานคลาสสิกคือการเริ่มต้นซิงเกิลตันแบบล่าช้า

Once.Do

เฉพาะการเรียก Do ครั้งแรกเท่านั้นที่จะเรียกใช้ฟังก์ชัน การเรียกครั้งต่อ ๆ ไปจะไม่ทำอะไร แม้จะเรียกจากโกโรทีนคนละตัวกัน

var once sync.Once
var db *Database

func getDB() *Database {
    once.Do(func() { db = openDB() })
    return db
}

Once ไม่รีเซ็ต

เมื่อ sync.Once ทำงานแล้ว จะไม่สามารถรีเซ็ตได้ หากต้องการให้การทำงานครั้งเดียวสามารถรีเซ็ตได้ คุณต้องจัดการสถานะเองด้วยการดำเนินการแบบอะตอมิกหรือ mutex

พฤติกรรมของ Once เมื่อเกิดแพนิก

หากฟังก์ชันที่ส่งให้ Do เกิดแพนิก Do จะถือว่าทำงานเสร็จแล้ว และการเรียกครั้งต่อไปจะไม่ทำอะไร แพนิกจะถูกส่งต่อไปยังผู้เรียกคนแรก

ภาพรวม sync.Map

sync.Map คือแมปที่ทำงานพร้อมกันได้โดยไม่ต้องใช้ล็อกภายนอก โดยได้รับการปรับให้เหมาะกับรูปแบบการใช้งานสองแบบ ได้แก่ (1) เขียนครั้งเดียว อ่านหลายครั้ง และ (2) แต่ละโกโรทีนใช้ชุดคีย์ที่ไม่ทับซ้อนกัน

เมธอดของ sync.Map

เมธอดสำคัญ ได้แก่ Store, Load, LoadOrStore, Delete และ Range ไม่มีพารามิเตอร์ชนิดแบบทั่วไป คีย์และค่าจึงเป็นชนิดอินเทอร์เฟซของ Go

var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }

LoadOrStore

LoadOrStore จะส่งคืนค่าที่มีอยู่เดิมหากมีคีย์นั้นอยู่ มิฉะนั้นจะจัดเก็บและส่งคืนค่าใหม่ ค่าบูลีนจะระบุว่าค่านั้นถูกโหลดมา (true) หรือถูกจัดเก็บ (false)

actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }

Range

Range จะวนซ้ำคู่คีย์-ค่าทั้งหมด โดยเรียกฟังก์ชันหนึ่งครั้งสำหรับแต่ละคู่ ให้ส่งคืน false เพื่อหยุดการวนซ้ำ

m.Range(func(k, v any) bool {
    fmt.Println(k, v)
    return true // continue
})

ควรใช้ sync.Map เมื่อใด

ในกรณีส่วนใหญ่ควรเลือกใช้แมปทั่วไปพร้อม Mutex เพราะเรียบง่ายกว่าและมักทำงานได้เร็วกว่า ใช้ sync.Map เมื่อการทำโปรไฟล์แสดงให้เห็นว่ามีการแย่งชิงทรัพยากร หรือรูปแบบการเข้าถึงตรงกับรูปแบบที่ sync.Map ได้รับการปรับให้เหมาะสม

LoadAndDelete

LoadAndDelete จะโหลดค่าและลบคีย์ออกด้วยการดำเนินการแบบอะตอมิก พร้อมส่งคืนค่าก่อนหน้าและระบุว่าคีย์นั้นมีอยู่หรือไม่

v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }

sync.Map ไม่ใช่ชนิดทั่วไป

ค่าที่จัดเก็บใน sync.Map มีชนิด any คุณควรห่อหุ้ม sync.Map ไว้ในโครงสร้างที่ระบุชนิด พร้อมเมธอดที่ปลอดภัยด้านชนิดข้อมูล เพื่อหลีกเลี่ยงการตรวจสอบชนิดที่กระจัดกระจายทั่วฐานโค้ด

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

sync.Once รับประกันอะไร

สรุป: sync.Once และ sync.Map

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

  • sync.Once: เรียกใช้ฟังก์ชันเพียงครั้งเดียวและย้อนกลับไม่ได้
  • sync.Map: แมปที่ทำงานพร้อมกันได้และได้รับการปรับให้เหมาะกับรูปแบบที่อ่านเป็นหลักหรือใช้คีย์ที่ไม่ทับซ้อนกัน
  • ใช้ตัวห่อหุ้มที่ระบุชนิดรอบ sync.Map เพื่อความปลอดภัย

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

บทเรียน “sync.Once และ sync.Map” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “sync.Once และ sync.Map”

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

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

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

บทเรียน “sync.Once และ sync.Map” ใช้เวลานานแค่ไหน

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

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

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

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

  1. sync.Mutex และ sync.RWMutex
  2. sync.WaitGroup
  3. sync.Once และ sync.Map
  4. ตัวตรวจจับภาวะแข่งขันและรูปแบบที่ปลอดภัย
← กลับไปที่ Go Academy