Skip to content

โครงสร้างข้อมูล

แม้ว่า 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 ผ่านกลไกการสำรวจ

คำแนะนำการเรียนรู้

แนะนำให้เรียนรู้ตามลำดับดังนี้

  1. เรียนรู้ slice สไลซ์ และ string สตริง ก่อน เข้าใจโครงสร้างข้อมูลพื้นฐาน
  2. จากนั้นเรียนรู้ map แผนที่ เข้าใจการใช้งานแฮชเทเบิล
  3. จากนั้นเรียนรู้ channel ช่องสัญญาณ เข้าใจกลไกการสื่อสารระหว่าง goroutine
  4. จากนั้นเรียนรู้ select การ复用หลายทาง เข้าใจเทคนิคการ复用หลายทาง
  5. สุดท้ายเรียนรู้ syncmap แผนที่พร้อมกัน เข้าใจการใช้งานความปลอดภัยต่อการทำงานพร้อมกัน

Golang by www.golangdev.cn edit