Go 1.25 ได้เปิดตัวแล้วพร้อมกับการปรับปรุงที่น่าสนใจหลายประการ แต่ความสนใจของชุมชนนักพัฒนากลับมุ่งไปที่ฟีเจอร์เด่นหนึ่งเดียว นั่นคือแพ็กเกจ JSON v2 แบบทดลอง การใช้งานใหม่นี้สัญญาว่าจะแก้ไขปัญหาประสิทธิภาพที่มีมายาวนานซึ่งเป็นปัญหาให้กับนักพัฒนา Go ที่ทำงานกับข้อมูล JSON
การเปิดตัวครั้งนี้ยังคงรักษาความมุ่งมั่นของ Go ในการรองรับความเข้ากันได้แบบย้อนหลังพร้อมกับการนำเสนอการปรับปรุงที่สำคัญภายใต้ระบบ การเปลี่ยนแปลงส่วนใหญ่มุ่งเป้าไปที่ toolchain, runtime และ standard library มากกว่าตัวภาษาเอง เพื่อให้มั่นใจว่าโปรแกรม Go ที่มีอยู่จะยังคงทำงานได้อย่างราบรื่น
แพ็กเกจ JSON v2 แบบทดลองขโมยความสนใจ
แพ็กเกจ encoding/json/v2
ใหม่เป็นตัวแทนของการปรับปรุงครั้งใหญ่ในความสามารถการจัดการ JSON ของ Go ซ่อนอยู่หลังแฟล็ก GOEXPERIMENT=jsonv2
ฟีเจอร์ทดลองนี้ได้สร้างความตื่นเต้นอย่างมากในชุมชนนักพัฒนา การใช้งานใหม่นี้แก้ไขจุดเจ็บปวดที่สำคัญสองประการ คือ ปัญหาคอขวดด้านประสิทธิภาพกับเอกสารขนาดใหญ่ และการไม่สามารถเพิ่มโค้ด marshaling แบบกำหนดเองให้กับประเภทภายนอกได้
การปรับปรุงประสิทธิภาพมีความโดดเด่น โดยประสิทธิภาพการเข้ารหัสเทียบเท่ากับการใช้งานต้นฉบับ ในขณะที่การถอดรหัสแสดงให้เห็นถึงการเพิ่มความเร็วอย่างมีนัยสำคัญ สถาปัตยกรรมแบบสตรีมมิ่งแก้ไขปัญหาธรรมชาติแบบไม่สตรีมมิ่งของแพ็กเกจต้นฉบับ ซึ่งทำให้เกิดปัญหาประสิทธิภาพกับเอกสาร JSON ขนาดใหญ่ นอกจากนี้ นักพัฒนาสามารถใช้งาน custom marshaler สำหรับประเภทที่พวกเขาไม่สามารถควบคุมได้ ซึ่งเป็นฟีเจอร์ที่ได้รับการร้องขออย่างต่อเนื่องและเปิดโอกาสใหม่ ๆ สำหรับการจัดการ JSON
หมายเหตุ: GOEXPERIMENT เป็นกลไกของ Go สำหรับทดสอบฟีเจอร์ทดลองก่อนที่จะกลายเป็นส่วนหนึ่งของ standard library
คุณสมบัติหลักของ Go 1.25:
-
แพ็กเกจ JSON v2 เชิงทดลอง: ใช้งานได้ด้วยแฟล็ก
GOEXPERIMENT=jsonv2
- สถาปัตยกรรมแบบ streaming เพื่อประสิทธิภาพที่ดีขึ้นกับเอกสารขนาดใหญ่
- รองรับการ marshaling แบบกำหนดเองสำหรับ external types
- ประสิทธิภาพการ encoding อยู่ในระดับเดียวกัน การ decoding เร็วขึ้นอย่างมาก
- แพ็กเกจใหม่สองตัว:
encoding/json/v2
และencoding/json/jsonpath
-
Container-Aware GOMAXPROCS:
- พิจารณาขีดจำกัดแบนด์วิดท์ CPU จาก cgroups บน Linux โดยอัตโนมัติ
- ปรับให้เหมาะสมเป็นระยะๆ ตาม logical CPUs ที่มีอยู่
- จะถูกปิดใช้งานหากตั้งค่าด้วยตนเองผ่านตัวแปรสภาพแวดล้อมหรือการเรียก runtime
-
Garbage Collector เชิงทดลอง:
- เปิดใช้งานด้วย
GODEBUG=gctransform=1
ในเวลา build - คาดว่าจะลด GC overhead ลง 10-40%
- ประสิทธิภาพที่ดีขึ้นสำหรับการ marking และ scanning วัตถุขนาดเล็ก
- เปิดใช้งานด้วย
การปรับปรุง Runtime ที่รู้เรื่อง Container
Go 1.25 เปิดตัวการจัดการทรัพยากรที่ฉลาดขึ้นด้วยพฤติกรรม GOMAXPROCS
ที่รู้เรื่อง container ในระบบ Linux runtime ตัวนี้จะพิจารณาขีดจำกัดแบนด์วิดท์ CPU จาก cgroups โดยปรับ GOMAXPROCS
อัตโนมัติเมื่อทำงานในสภาพแวดล้อม containerized อย่าง Kubernetes การเปลี่ยนแปลงนี้ช่วยให้แอปพลิเคชัน Go ใช้ทรัพยากรที่มีอยู่ได้ดีขึ้นโดยไม่ต้องกำหนดค่าด้วยตนเอง
Runtime ยังรวมถึง garbage collector แบบทดลองที่สัญญาว่าจะลดค่าใช้จ่าย garbage collection ลง 10-40% สำหรับโปรแกรมที่ใช้ garbage collector อย่างหนัก ผลการทดสอบเบื้องต้นแสดงผลลัพธ์ที่น่าสัญญา แม้ว่าการออกแบบจะยังคงพัฒนาต่อไปตามความคิดเห็นของชุมชน
เครื่องมือพัฒนาและการดีบักที่ได้รับการปรับปรุง
เครื่องมือใหม่หลายตัวช่วยเพิ่มประสบการณ์การพัฒนา เมธอด WaitGroup.Go
ทำให้รูปแบบทั่วไปของการสร้างและนับ goroutine ง่ายขึ้น ช่วยให้นักพัฒนาลดโค้ด boilerplate ได้ API trace flight recorder ใหม่ให้การติดตาม execution แบบเบาโดยบันทึกการติดตามอย่างต่อเนื่องลงใน in-memory ring buffer ทำให้สามารถดีบักเหตุการณ์หายากได้อย่างปฏิบัติได้จริง
Compiler ตอนนี้สร้างข้อมูลดีบักโดยใช้ DWARFv5 ลดขนาด binary และเวลา linking โดยเฉพาะอย่างยิ่งเป็นประโยชน์สำหรับแอปพลิเคชัน Go ขนาดใหญ่ การจัดสรร stack สำหรับ slice backing store ได้รับการปรับปรุง แม้ว่านักพัฒนาควรตรวจสอบปัญหา stack bloat ที่อาจเกิดขึ้น
การปรับปรุงเครื่องมือสำหรับนักพัฒนา:
- เมธอด WaitGroup.Go ใหม่: ช่วยลดความซับซ้อนในการสร้าง goroutine และรูปแบบการนับ
- Trace Flight Recorder API:
runtime/trace.FlightRecorder
สำหรับการติดตามการทำงานแบบน้ำหนักเบา - การรองรับ DWARFv5: ลดขนาดข้อมูลการ debug และเวลาในการ linking
- การปรับปรุง Vet Analyzers: เครื่องมือวิเคราะห์
asmdecl
และloopvar
ใหม่สำหรับการวิเคราะห์โค้ดที่ดีขึ้น - การปรับปรุงการทดสอบ: แพ็กเกจ
testing/slogtest
ใหม่สำหรับการทดสอบโค้ดแบบ concurrent
การอัปเดตการรองรับแพลตฟอร์ม:
- ความต้องการขั้นต่ำ macOS 11 ( Big Sur )
- Windows 32-bit port (
GOOS=windows GOARCH=386
) ถูกยกเลิกการใช้งาน จะถูกลบออกใน Go 1.26 - การรองรับ Linux/loong64 และ Linux/riscv64 ที่ได้รับการปรับปรุง
การตอบสนองของชุมชนและมุมมองอนาคต
การตอบสนองของชุมชน Go เป็นไปในทางบวกอย่างท่วมท้น โดยเฉพาะอย่างยิ่งเกี่ยวกับการปรับปรุง JSON และการมุ่งเน้นอย่างต่อเนื่องของภาษาในด้านความสามารถในการบำรุงรักษา นักพัฒนาหลายคนชื่นชมแนวทางที่รอบคอบของ Go ต่อฟีเจอร์ใหม่ ๆ โดยให้ความสำคัญกับความเสถียรและความเข้ากันได้แบบย้อนหลังมากกว่าการเพิ่มฟีเจอร์อย่างรวดเร็ว
ฉันรักวิธีที่ภาษานี้เดินหน้าไป ฉันมีเพื่อนร่วมงานหลายคนที่เกลียดหลายแง่มุมของมัน แต่ฉันนั่งที่นี่รวม Go, Goa และ SQLc เขียนโค้ดเป็นภูเขาและมี compiler ที่ค่อนข้างดีอยู่เบื้องหลังฉัน
ธรรมชาติการทดลองของ JSON v2 ช่วยให้ทีม Go รวบรวมความคิดเห็นจากชุมชนก่อนที่จะสรุป API ขั้นสุดท้าย นักพัฒนาได้รับการสนับสนุนให้ทดสอบแอปพลิเคชันของพวกเขาด้วยการใช้งานใหม่เพื่อช่วยระบุปัญหาความเข้ากันได้และให้ข้อมูลเกี่ยวกับการออกแบบที่กำลังพัฒนา
ในขณะที่ Go ยังคงเติบโต การเปิดตัวอย่าง 1.25 แสดงให้เห็นถึงความมุ่งมั่นของทีมในการปรับปรุงแบบเพิ่มหน่วยที่เพิ่มประสิทธิภาพการทำงานของนักพัฒนาในขณะที่รักษาหลักการหลักของภาษาในด้านความเรียบง่ายและความน่าเชื่อถือ
อ้างอิง: Go 1.25 Release Notes