การปรับปรุงสำคัญใน Go 1.24
(gosuda.org)Go 1.24 ดูจะเป็นรีลีสสำคัญที่มาพร้อมการปรับปรุงหลากหลายด้าน โดยมุ่งเน้นที่ประสิทธิภาพ ความปลอดภัย และประสบการณ์ของนักพัฒนา การเปลี่ยนแปลงเหล่านี้มีเป้าหมายเพื่อทำให้ Go ทรงพลังและมีประสิทธิภาพยิ่งขึ้นสำหรับการสร้างแอปพลิเคชันสมัยใหม่
การเพิ่มประสิทธิภาพ
มีการปรับปรุงประสิทธิภาพโดยรวมที่ช่วยลด CPU overhead ลง 2~3% ในชุดเบนช์มาร์กหลัก การปรับปรุงเหล่านี้รวมถึงการใช้งาน map แบบ built-in ใหม่ การจัดสรรหน่วยความจำที่มีประสิทธิภาพมากขึ้นสำหรับอ็อบเจ็กต์ขนาดเล็ก และการใช้งาน mutex ภายใน runtime แบบใหม่ ทั้งนี้ผลลัพธ์อาจแตกต่างกันไปตามแต่ละแอปพลิเคชัน
การเข้ารหัสที่ทนทานต่อควอนตัม
มีการเพิ่มแพ็กเกจ crypto/mlkem ที่รองรับ ML-KEM-768 และ ML-KEM-1024 โดย ML-KEM เดิมรู้จักกันในชื่อ Kyber และเป็นกลไกการแลกเปลี่ยนกุญแจที่ทนทานต่อควอนตัมตามที่ระบุไว้ใน FIPS 203 การเพิ่มส่วนนี้ช่วยให้ Go พร้อมรับมือกับความปลอดภัยด้านการเข้ารหัสในอนาคต
Encrypted Client Hello
รองรับ ECH (Encrypted Client Hello) ใน TLS โดยสามารถเปิดใช้งานฟีเจอร์นี้ได้ด้วยการกำหนดค่าในฟิลด์ Config.EncryptedClientHelloKeys ซึ่งช่วยเสริมความเป็นส่วนตัวและความปลอดภัยของการเชื่อมต่อ TLS
Swiss Table Map ใหม่
เป็นการใช้งาน map แบบปรับปรุงใหม่เพื่อประสิทธิภาพที่ดีกว่า โดยอิมพลีเมนเทชันใหม่นี้อิงจาก Swiss Tables และสามารถปิดใช้งานได้ด้วย build flag GOEXPERIMENT=noswissmap
อัปเดต Sync Map
ปรับปรุงประสิทธิภาพการแก้ไข map ใน sync.Map การแก้ไขชุดคีย์ที่แยกจากกันมีโอกาสเกิด contention น้อยลงมากใน map ขนาดใหญ่ และไม่จำเป็นต้องมีช่วง warm-up เพื่อให้ได้ภาระงานแบบ contention ต่ำใน map อีกต่อไป หากเกิดปัญหา สามารถย้อนกลับไปใช้อิมพลีเมนเทชันเดิมได้ด้วย GOEXPERIMENT=nosynchashtriemap
ปรับปรุงการ marshaling ของ JSON
มีตัวเลือกแท็ก omitempty แบบใหม่สำหรับการละฟิลด์ของ struct อย่างชาญฉลาดยิ่งขึ้นระหว่างการ marshaling JSON เมื่อทำการ marshaling หากค่าของฟิลด์ struct ที่มีตัวเลือก omitempty เป็น 0 ฟิลด์นั้นจะถูกละออกไป หากชนิดของฟิลด์มีเมธอด IsZero() bool ระบบจะใช้เมธอดนั้นเพื่อตรวจสอบว่าค่าเป็น 0 หรือไม่
การจัดระเบียบ runtime
มีการเพิ่มฟังก์ชัน AddCleanup เพื่อมาแทน SetFinalizer สำหรับการจัดการทรัพยากรที่ดีขึ้น ต่างจาก SetFinalizer ตรงที่มันจะไม่ชุบชีวิตอ็อบเจ็กต์ที่เชื่อมโยงไว้เพื่อทำ finalization และสามารถผูก cleanup ได้หลายรายการกับอ็อบเจ็กต์เดียว โค้ดใหม่ควรเลือกใช้ AddCleanup แทน SetFinalizer
คำสั่ง tool ใน go.mod
ปรับปรุงการติดตามการพึ่งพาของเครื่องมือด้วยคำสั่ง tool ใน go.mod ทำให้ไม่จำเป็นต้องใช้วิธีแก้ปัญหาแบบเดิมที่เพิ่มเครื่องมือผ่าน blank import ลงในไฟล์ที่มักตั้งชื่อว่า “tools.go” อีกต่อไป
การเข้าถึงแบบจำกัดไดเรกทอรี
มีชนิด os.Root ใหม่สำหรับการทำงานกับไฟล์ซิสเต็มแบบควบคุมได้ โดยชนิด os.Root มอบความสามารถในการทำงานกับไฟล์ซิสเต็มภายในไดเรกทอรีที่กำหนด เพื่อป้องกันการเข้าถึงนอกพาธที่ระบุ
การปรับปรุงการทดสอบ
มีแพ็กเกจ testing/synctest ใหม่สำหรับทดสอบโค้ดที่ทำงานพร้อมกัน ฟังก์ชัน synctest.Run จะเริ่มกลุ่ม goroutine ภายใน “bubble” ที่แยกออกมา และฟังก์ชัน synctest.Wait จะรอจนกว่า goroutine ทั้งหมดใน bubble ปัจจุบันจะถูกบล็อก แพ็กเกจนี้ยังเป็นแบบ experimental และต้องเปิดใช้งานโดยตั้งค่า GOEXPERIMENT=synctest ในขั้นตอน build
Build cache
ตอนนี้ไฟล์รันของ go run จะถูกแคชไว้เพื่อให้รันครั้งต่อไปได้เร็วขึ้น แม้จะแลกกับขนาดแคชที่เพิ่มขึ้น
ประสิทธิภาพของ Cgo
มี annotation ใหม่ #cgo noescape และ #cgo nocallback เพื่อปรับปรุงประสิทธิภาพของ Cgo โดย #cgo noescape cFunctionName ใช้บอกคอมไพเลอร์ว่าหน่วยความจำที่ส่งเข้าไปยังฟังก์ชัน C จะไม่ escape และ #cgo nocallback cFunctionName ใช้บอกคอมไพเลอร์ว่าฟังก์ชัน C จะไม่เรียกกลับมายังฟังก์ชัน Go
Weak pointers
รองรับ weak pointers สำหรับการอ้างอิงหน่วยความจำอย่างปลอดภัยโดยไม่ขัดขวางการเก็บคืน weak pointers เป็น primitive ระดับล่างที่จัดเตรียมไว้เพื่อให้สามารถสร้างโครงสร้างที่ใช้หน่วยความจำอย่างมีประสิทธิภาพ เช่น weak map สำหรับเชื่อมโยงค่า, canonicalization map และแคชหลายประเภท
การปรับปรุงการทดสอบเบนช์มาร์ก
มีเมธอด testing.B.Loop ใหม่สำหรับทำเบนช์มาร์กที่เร็วขึ้นและผิดพลาดน้อยลง ฟังก์ชันเบนช์มาร์กจะรันเพียงหนึ่งครั้งต่อ -count ดังนั้นขั้นตอนตั้งค่าและเก็บกวาดที่มีต้นทุนสูงจะถูกรันเพียงครั้งเดียว พารามิเตอร์และผลลัพธ์ของการเรียกฟังก์ชันจะยังคงอยู่ ทำให้คอมไพเลอร์ไม่สามารถ optimize เนื้อหาภายในลูปออกทั้งหมดได้
Go 1.24 ดูจะเป็นรีลีสสำคัญที่มอบการปรับปรุงอย่างมากในหลายด้านของภาษาและระบบนิเวศของมัน
4 ความคิดเห็น
มีใครที่ใช้ Go อยู่บ้างไหมครับ มีฟีเจอร์อะไรที่อยากได้กันไหม?
ส่วนตัวผมอยากได้โอเปอเรเตอร์แบบ
.?กับ??แล้วก็ถ้าเป็นไปได้ก็อยากให้มีมาโครด้วยครับพูดตามตรง
struct tagเป็นความผิดพลาดครับส่วนตัวผมก็หวังจริง ๆ ว่าจะมี macro สักที ต้อง
generateกันไปถึงเมื่อไหร่กัน T_Tสงสัยว่าเหตุผลที่
struct tagถือเป็นข้อผิดพลาดคืออะไรปัญหาใหญ่ที่สุดคือแทบจะพึ่งพาเครื่องมือช่วยได้ยาก
gomodifytags ออกมานานแล้วเหมือนกัน แต่การรวมเข้ากับ Go extension ของ VSC ก็ช้าพอสมควร