3 คะแนน โดย lemonmint 2024-12-20 | 4 ความคิดเห็น | แชร์ทาง WhatsApp

[IMG] Overview of Go 1.24

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 ความคิดเห็น

 
secret3056 2024-12-20

มีใครที่ใช้ Go อยู่บ้างไหมครับ มีฟีเจอร์อะไรที่อยากได้กันไหม?
ส่วนตัวผมอยากได้โอเปอเรเตอร์แบบ .? กับ ?? แล้วก็ถ้าเป็นไปได้ก็อยากให้มีมาโครด้วยครับ

พูดตามตรง struct tag เป็นความผิดพลาดครับ

 
gkswnsqja 2024-12-20

ส่วนตัวผมก็หวังจริง ๆ ว่าจะมี macro สักที ต้อง generate กันไปถึงเมื่อไหร่กัน T_T

 
qkrqjadn 2024-12-20

สงสัยว่าเหตุผลที่ struct tag ถือเป็นข้อผิดพลาดคืออะไร

 
secret3056 2024-12-20

ปัญหาใหญ่ที่สุดคือแทบจะพึ่งพาเครื่องมือช่วยได้ยาก

  • เพราะเป็นสตริง ต่อให้พิมพ์ผิดก็หาข้อผิดพลาดได้ยาก
  • ถ้าไม่ใช่ json ก็ไม่มีทั้งการเติมข้อความอัตโนมัติหรือ IntelliSense
  • เวลาใช้หลายเครื่องมือ ต้องเขียนทั้งหมดไว้ในบรรทัดเดียว ทำให้หลีกเลี่ยงความรู้สึกว่าอ่านยากไม่ได้

gomodifytags ออกมานานแล้วเหมือนกัน แต่การรวมเข้ากับ Go extension ของ VSC ก็ช้าพอสมควร