โครงสร้างข้อมูล
แม้ว่า Go จะมีไวยากรณ์ที่เรียบง่าย แต่มีโครงสร้างข้อมูลหลักที่ทรงพลังหลายอย่าง โครงสร้างข้อมูลเหล่านี้เป็นบล็อกพื้นฐานของการเขียนโปรแกรม Go การเข้าใจหลักการการทำงานของโครงสร้างข้อมูลเหล่านี้จะช่วยให้เขียนโค้ดที่มีประสิทธิภาพมากขึ้น บทความนี้จะแนะนำโครงสร้างข้อมูลที่ใช้บ่อยที่สุดหลายอย่างใน Go และการใช้งานระดับล่าง
โครงสร้างข้อมูลพื้นฐาน
slice สไลซ์
Slice เป็นโครงสร้างข้อมูลที่ใช้บ่อยที่สุดใน Go เป็นการสรุปและห่อหุ้มอาร์เรย์ มีลักษณะหลักดังนี้
- ขนาดแบบไดนามิก ความยาวของ slice สามารถเพิ่มขึ้นแบบไดนามิก
- การอ้างอิง เมื่อส่ง slice จะคัดลอกเฉพาะโครงสร้าง ไม่คัดลอกอาร์เรย์ระดับล่าง
- กลไกการขยาย เมื่อความจุไม่เพียงพอจะขยายอัตโนมัติ
Slice ในขณะทำงานแสดงด้วยโครงสร้าง slice ประกอบด้วยตัวชี้ไปยังอาร์เรย์ระดับล่าง ความยาว และความจุ
string สตริง
String เป็นหนึ่งในประเภทข้อมูลพื้นฐานที่สุดใน Go มีลักษณะหลักดังนี้
- ไม่เปลี่ยนแปลง เมื่อสร้าง string แล้วไม่สามารถแก้ไขได้
- การเข้ารหัส UTF-8 โดยปกติแสดงข้อความที่เข้ารหัส UTF-8
- ค่าเริ่มต้นปลอดภัย ค่าเริ่มต้นของ string คือสตริงว่าง
""ไม่ใช่nil
String ในขณะทำงานแสดงด้วยโครงสร้าง stringStruct ประกอบด้วยตัวชี้ไปยังอาร์เรย์ไบต์และความยาว
โครงสร้างข้อมูลคอนเทนเนอร์
map แผนที่
Map เป็นคอนเทนเนอร์คีย์-ค่าที่สร้างไว้ใน Go ใช้แฮชเทเบิลในการใช้งานระดับล่าง มีลักษณะหลักดังนี้
- ใช้แฮชเทเบิล ระบุตำแหน่งองค์ประกอบอย่างรวดเร็วผ่านฟังก์ชันแฮช
- ขยายอัตโนมัติ เมื่อปัจจัยโหลดสูงเกินไปจะขยายอัตโนมัติ
- ไม่ปลอดภัยต่อการทำงานพร้อมกัน การอ่านเขียนพร้อมกันต้องการกลไกซิงโครไนซ์เพิ่มเติม
Map ในขณะทำงานแสดงด้วยโครงสร้าง hmap ประกอบด้วยอาร์เรย์ถัง เมล็ดแฮช จำนวนองค์ประกอบ เป็นต้น
syncmap แผนที่พร้อมกัน
sync.Map เป็นแผนที่ที่ปลอดภัยต่อการทำงานพร้อมกันที่จัดให้โดยไลบรารีมาตรฐาน เหมาะสำหรับสถานการณ์ที่อ่านมากเขียนน้อย มีลักษณะหลักดังนี้
- แยกการอ่านเขียน ใช้ map สองตัวคือ read และ dirty เพื่อแยกการอ่านเขียน
- การดำเนินการอะตอมมิก read map ใช้การดำเนินการอะตอมมิก ไม่ต้องล็อก
- การย้ายแบบค่อยเป็นค่อยไป เมื่อ miss count ถึงเกณฑ์จะยก dirty เป็น read
sync.Map ใช้พื้นที่แลกเวลา ในสถานการณ์เฉพาะให้ประสิทธิภาพที่ดีกว่า map + mutex
โครงสร้างข้อมูลพร้อมกัน
channel ช่องสัญญาณ
Channel เป็นตัวแทนของแนวคิด CSP ใน Go ใช้สำหรับการสื่อสารระหว่าง goroutine มีลักษณะหลักดังนี้
- การสื่อสารระหว่าง goroutine ส่งข้อมูลระหว่าง goroutine ผ่าน channel
- กลไกซิงโครไนซ์ channel ที่ไม่มีบัฟเฟอร์สามารถใช้สำหรับซิงโครไนซ์ goroutine
- คิวที่มีล็อก ระดับล่างเป็นคิววงกลมที่มีล็อก
Channel ในขณะทำงานแสดงด้วยโครงสร้าง hchan ประกอบด้วยบัฟเฟอร์วงกลม คิวรอ เป็นต้น
select การ复用หลายทาง
Select สามารถติดตามสถานะของหลาย channel พร้อมกัน ทำการ复用หลายทาง มีลักษณะหลักดังนี้
- ไม่บล็อก สามารถตรวจสอบว่าหลาย channel พร้อมใช้งานหรือไม่โดยไม่บล็อก
- เลือกแบบสุ่ม เมื่อหลาย channel พร้อมใช้งานจะเลือกหนึ่งอันเพื่อดำเนินการแบบสุ่ม
- ควบคุมเวลาหมดอายุ ใช้ร่วมกับ
time.Afterเพื่อสร้างกลไกเวลาหมดอายุ
Select ในขณะทำงานแสดงด้วยโครงสร้าง scase สำหรับแต่ละสาขา ตรวจสอบสถานะ channel ผ่านกลไกการสำรวจ
คำแนะนำการเรียนรู้
แนะนำให้เรียนรู้ตามลำดับดังนี้
- เรียนรู้ slice สไลซ์ และ string สตริง ก่อน เข้าใจโครงสร้างข้อมูลพื้นฐาน
- จากนั้นเรียนรู้ map แผนที่ เข้าใจการใช้งานแฮชเทเบิล
- จากนั้นเรียนรู้ channel ช่องสัญญาณ เข้าใจกลไกการสื่อสารระหว่าง goroutine
- จากนั้นเรียนรู้ select การ复用หลายทาง เข้าใจเทคนิคการ复用หลายทาง
- สุดท้ายเรียนรู้ syncmap แผนที่พร้อมกัน เข้าใจการใช้งานความปลอดภัยต่อการทำงานพร้อมกัน
