เปิดตัว Go 1.25
(go.dev)Go 1.25 เปิดตัวอย่างเป็นทางการแล้ว เวอร์ชันนี้มาพร้อมการปรับปรุงในวงกว้างครอบคลุมทั้งเครื่องมือ รันไทม์ คอมไพเลอร์ และไลบรารีมาตรฐาน โดยเฉพาะฟีเจอร์ทดลองสำคัญที่เปิดให้ผู้ใช้ลองใช้งานล่วงหน้าและส่งข้อเสนอแนะได้
- คุณสมบัติเด่น:
- ยังคงความเข้ากันได้กับ Go 1
- ปรับปรุงในวงกว้างทั้งเครื่องมือ รันไทม์ คอมไพเลอร์ และไลบรารี
- เพิ่มฟีเจอร์ทดลองใหม่ (GreenTea GC, แพ็กเกจ json/v2)
ฟีเจอร์ทดลองหลัก
Go 1.25 มีฟีเจอร์ทดลองสำคัญ 2 อย่างที่มุ่งเพิ่มประสิทธิภาพและปรับปรุงความสามารถ โดยผู้ใช้สามารถเปิดใช้งานได้ผ่านการตั้งค่าตัวแปรสภาพแวดล้อม
ตัวเก็บขยะ GreenTea (GC) แบบใหม่
มีเป้าหมายเพื่อเพิ่มประสิทธิภาพด้วยการลดโอเวอร์เฮดของ GC ที่เกิดขึ้นเมื่อจัดการอ็อบเจ็กต์ขนาดเล็กจำนวนมาก
- หลักการทำงาน: จะจัดกลุ่มอ็อบเจ็กต์ขนาดเล็กที่มีขนาดต่ำกว่า 512 ไบต์เป็นหน่วย 'เมมโมรีสแปน (Memory Span)' ขนาด 8KiB เพื่อทำ GC ซึ่งช่วยเพิ่ม locality ของหน่วยความจำและทำให้ CPU cache มีประสิทธิภาพสูงสุด
- ผลที่คาดหวัง:
- ประสิทธิภาพ GC ดีขึ้นจากการลดต้นทุนของการกระโดดหน่วยความจำ
- ทำงานได้อย่างมีประสิทธิภาพในสภาพแวดล้อมแบบหลายคอร์
- ลดโอเวอร์เฮดในการจัดสรรอ็อบเจ็กต์ขนาดเล็กและลดการกระจายตัวของหน่วยความจำ
- วิธีเปิดใช้งาน: ตั้งค่าตัวแปรสภาพแวดล้อม
GOEXPERIMENT=greenteagcตอน build
แพ็กเกจ encoding/json/v2 ใหม่
เป็น implementation ของ JSON ที่ออกแบบขึ้นใหม่เพื่อแก้ปัญหาความไม่สม่ำเสมอ พฤติกรรมที่คาดเดาได้ยาก และปัญหาด้านประสิทธิภาพของ encoding/json (v1) เดิม
-
เป้าหมายหลัก:
- เพิ่มความถูกต้องและความคาดเดาได้: ใช้กฎที่เข้มงวดขึ้นโดยค่าเริ่มต้น (เช่น แยกตัวพิมพ์เล็ก-ใหญ่ และไม่อนุญาตคีย์ซ้ำ) เพื่อลดพฤติกรรมที่ไม่คาดคิด
- ปรับปรุงประสิทธิภาพ: ออกแบบเอนจินการ parse และ encode ใหม่เพื่อเพิ่มประสิทธิภาพ
- เพิ่มความยืดหยุ่นและการควบคุม: เพิ่มระบบ options ที่ละเอียดขึ้นเพื่อให้นักพัฒนาควบคุมวิธีประมวลผล JSON ได้อย่างละเอียด
-
การเปลี่ยนแปลงสำคัญ (v2 เทียบกับ v1):
- การจับคู่ชื่อฟิลด์: ต่างจาก v1 ที่ไม่แยกตัวพิมพ์เล็ก-ใหญ่ v2 จะ แยกตัวพิมพ์เล็ก-ใหญ่อย่างเคร่งครัด โดยค่าเริ่มต้น
- ความหมายของแท็ก
omitemptyเปลี่ยนไป: หาก v1 ละค่าโดยอิงจากสถานะ 'ว่าง' ของค่า Go (0, false, nil ฯลฯ) แล้ว v2 จะละค่าโดยอิงจากสถานะ 'ว่าง' ของค่า JSON ที่เข้ารหัสแล้ว (null,"",{},[]) - การจัดการ
nilslice และ map: v1 marshal เป็นnullแต่ v2 จะ marshal เป็น[](อาร์เรย์ว่าง) และ{}(อ็อบเจ็กต์ว่าง) ตามลำดับโดยค่าเริ่มต้น - การ unmarshal อาร์เรย์: v1 อนุญาตแม้ความยาวของอาร์เรย์ JSON และอาร์เรย์ Go จะไม่เท่ากัน แต่ v2 จะต้อง มีความยาวตรงกันเป๊ะ เท่านั้น ไม่เช่นนั้นจะคืนข้อผิดพลาด
- การจัดการคีย์ซ้ำ: v1 อนุญาตคีย์ซ้ำได้ (เขียนทับด้วยค่าล่าสุด) แต่ v2 จะ คืนข้อผิดพลาด โดยค่าเริ่มต้น เพื่อเพิ่มความถูกต้องและความปลอดภัย
- การจัดการ UTF-8 ที่ไม่ถูกต้อง: v1 แทนที่อักขระ UTF-8 ที่ไม่ถูกต้องโดยอัตโนมัติ (
\uFFFD) แต่ v2 จะ คืนข้อผิดพลาด โดยค่าเริ่มต้นเพื่อป้องกันข้อมูลเสียหาย
-
ฟีเจอร์และโครงสร้างใหม่:
- โครงสร้างแบบโมดูลาร์: แยกการวิเคราะห์ไวยากรณ์ระดับล่าง (
jsontextpackage) ออกจากการแปลงเชิงความหมายระดับสูง (json/v2package) เพื่อให้โค้ดชัดเจนขึ้นและมีประสิทธิภาพดีขึ้น - ระบบ options ที่ทรงพลัง: ผ่าน
json.Optionsสามารถควบคุมพฤติกรรมต่าง ๆ ได้อย่างละเอียด และยังสามารถจำลองพฤติกรรมของ v1 ได้อย่างสมบูรณ์ - การจัดการ type ภายนอก: ผ่าน options
WithMarshalers,WithUnmarshalersสามารถฉีดตรรกะ serialization/deserialization สำหรับ type จากแพ็กเกจภายนอกที่ไม่ได้ implement อินเทอร์เฟซMarshaler/Unmarshalerได้
- โครงสร้างแบบโมดูลาร์: แยกการวิเคราะห์ไวยากรณ์ระดับล่าง (
-
วิธีเปิดใช้งาน: ตั้งค่าตัวแปรสภาพแวดล้อม
GOEXPERIMENT=jsonv2ตอน build
การเปลี่ยนแปลงและการปรับปรุงหลัก
รีลีสนี้มีการปรับปรุงหลากหลายเพื่อเพิ่มผลิตภาพของนักพัฒนาและประสิทธิภาพในการรันโปรแกรม
-
รันไทม์ (Runtime)
- GOMAXPROCS ที่รับรู้สภาพแวดล้อมคอนเทนเนอร์: บน Linux จะรับรู้ข้อจำกัด CPU ของ cgroup โดยอัตโนมัติเพื่อตั้งค่าเริ่มต้นของ
GOMAXPROCSและอัปเดตแบบไดนามิกเมื่อทรัพยากร CPU เปลี่ยนแปลง - Trace Flight Recorder: มีฟีเจอร์ติดตามแบบน้ำหนักเบาที่บันทึก runtime trace อย่างต่อเนื่องลงใน ring buffer ในหน่วยความจำ เพื่อดีบักบั๊กที่เกิดขึ้นไม่บ่อย
- GOMAXPROCS ที่รับรู้สภาพแวดล้อมคอนเทนเนอร์: บน Linux จะรับรู้ข้อจำกัด CPU ของ cgroup โดยอัตโนมัติเพื่อตั้งค่าเริ่มต้นของ
-
เครื่องมือและคอมไพเลอร์ (Tools & Compiler)
- แก้บั๊ก nil pointer: มีการแก้บั๊กของคอมไพเลอร์ที่มีมาตั้งแต่ Go 1.21 ซึ่งทำให้การตรวจสอบ nil pointer ล่าช้า ส่งผลให้โค้ดที่เคยทำงานผ่านอย่างผิดปกติ ตอนนี้จะ panic อย่างถูกต้อง
- รองรับ DWARF5: ใช้ DWARF เวอร์ชัน 5 สำหรับข้อมูลดีบัก ช่วยลดขนาดไบนารีและเวลาในการลิงก์
- directive
go.mod ignoreใหม่: สามารถตั้งค่าให้คำสั่งgoเพิกเฉยบางไดเรกทอรีได้
-
ไลบรารีมาตรฐาน (Standard Library)
- เพิ่มแพ็กเกจ
testing/synctest: เป็นแพ็กเกจใหม่ที่ช่วยทดสอบโค้ด concurrency โดยสามารถรันทดสอบแบบแยกขาดในเวลาเสมือนจริงได้ - ปรับปรุงประสิทธิภาพแพ็กเกจ
crypto: ความเร็วการลงนามecdsa,ed25519ในโหมด FIPS เร็วขึ้น 4 เท่า และประสิทธิภาพของ SHA hashing ก็ดีขึ้น - เพิ่ม CrossOriginProtection ใน
net/http: เพิ่มฟีเจอร์ใหม่สำหรับป้องกันการโจมตี CSRF โดยใช้ Fetch metadata ของเบราว์เซอร์สมัยใหม่
- เพิ่มแพ็กเกจ
การเปลี่ยนแปลงด้านพอร์ตและการรองรับ
- macOS: ตั้งแต่ Go 1.25 เป็นต้นไป ต้องใช้ macOS 12 Monterey หรือใหม่กว่า
- Windows: พอร์ต 32 บิต
windows/armจะยุติการรองรับหลังรีลีสนี้
ยังไม่มีความคิดเห็น