[IMG] Overview

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, "", {}, [])
    • การจัดการ nil slice และ map: v1 marshal เป็น null แต่ v2 จะ marshal เป็น [] (อาร์เรย์ว่าง) และ {} (อ็อบเจ็กต์ว่าง) ตามลำดับโดยค่าเริ่มต้น
    • การ unmarshal อาร์เรย์: v1 อนุญาตแม้ความยาวของอาร์เรย์ JSON และอาร์เรย์ Go จะไม่เท่ากัน แต่ v2 จะต้อง มีความยาวตรงกันเป๊ะ เท่านั้น ไม่เช่นนั้นจะคืนข้อผิดพลาด
    • การจัดการคีย์ซ้ำ: v1 อนุญาตคีย์ซ้ำได้ (เขียนทับด้วยค่าล่าสุด) แต่ v2 จะ คืนข้อผิดพลาด โดยค่าเริ่มต้น เพื่อเพิ่มความถูกต้องและความปลอดภัย
    • การจัดการ UTF-8 ที่ไม่ถูกต้อง: v1 แทนที่อักขระ UTF-8 ที่ไม่ถูกต้องโดยอัตโนมัติ (\uFFFD) แต่ v2 จะ คืนข้อผิดพลาด โดยค่าเริ่มต้นเพื่อป้องกันข้อมูลเสียหาย
  • ฟีเจอร์และโครงสร้างใหม่:

    • โครงสร้างแบบโมดูลาร์: แยกการวิเคราะห์ไวยากรณ์ระดับล่าง (jsontext package) ออกจากการแปลงเชิงความหมายระดับสูง (json/v2 package) เพื่อให้โค้ดชัดเจนขึ้นและมีประสิทธิภาพดีขึ้น
    • ระบบ 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 ในหน่วยความจำ เพื่อดีบักบั๊กที่เกิดขึ้นไม่บ่อย
  • เครื่องมือและคอมไพเลอร์ (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 จะยุติการรองรับหลังรีลีสนี้

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น