- Go เวอร์ชัน 1.22 เปิดตัวหลังจาก Go 1.21 ผ่านไป 6 เดือน
- การเปลี่ยนแปลงส่วนใหญ่อยู่ที่การอิมพลีเมนต์ของ toolchain, runtime และไลบรารี
- ยังคงรักษาคำมั่นสัญญาด้านความเข้ากันได้ของ Go 1 ไว้ และคาดว่าโปรแกรม Go เกือบทั้งหมดจะยังคอมไพล์และทำงานได้เหมือนเดิม
การเปลี่ยนแปลงของภาษา
- มีการเปลี่ยนแปลง 2 อย่างเกี่ยวกับลูป "for"
- ก่อนหน้านี้ตัวแปรที่ประกาศโดยลูป "for" จะถูกสร้างขึ้นครั้งเดียวและอัปเดตในแต่ละรอบการวน แต่ใน Go 1.22 การวนแต่ละรอบของลูปจะสร้างตัวแปรใหม่ เพื่อป้องกันบั๊กจากการแชร์ตัวแปรโดยไม่ตั้งใจ
- ตอนนี้ลูป "for" สามารถกำหนดช่วงกับจำนวนเต็มได้แล้ว
เครื่องมือ
คำสั่ง Go
- ใน workspace สามารถใช้ไดเรกทอรี
vendor เพื่อจัดการ dependency ได้
go get ไม่รองรับโหมด GOPATH แบบเดิมที่ไม่ใช่โมดูลอีกต่อไป
- ตอนนี้
go mod init จะไม่พยายามนำเข้าข้อกำหนดของโมดูลจากไฟล์ตั้งค่าของเครื่องมือ vendoring อื่นอีกแล้ว
- ตอนนี้
go test -cover จะแสดงสรุป coverage สำหรับแพ็กเกจที่ไม่มีไฟล์ทดสอบของตัวเองด้วย
Trace
- เว็บ UI ของเครื่องมือ
trace ถูกออกแบบใหม่บางส่วนเพื่อรองรับ tracer ตัวใหม่
Vet
- มีการเปลี่ยนแปลงพฤติกรรมของเครื่องมือ
vet สำหรับตัวแปรในลูป
- เพิ่มคำเตือนใหม่สำหรับการเรียก
append ที่ไม่ได้เพิ่มค่าใด ๆ
- เพิ่มคำเตือนใหม่เกี่ยวกับปัญหาที่เกิดเมื่อใช้
time.Since ในคำสั่ง defer
- เพิ่มคำเตือนใหม่เมื่อคู่คีย์-ค่าไม่ตรงกันในการเรียก
log/slog
รันไทม์
- ปรับปรุงประสิทธิภาพ CPU ได้ 1-3% โดยเก็บเมทาดาทา garbage collection ที่อิงตาม type ไว้ใกล้ออบเจ็กต์บน heap มากขึ้น
คอมไพเลอร์
- การ build แบบ Profile-Guided Optimization (PGO) สามารถ devirtualize การเรียกใช้งานได้มากกว่าเดิม
ลิงเกอร์
- มีการเปลี่ยนให้แฟล็ก
-s และ -w ของลิงเกอร์ทำงานสอดคล้องกันมากขึ้นในทุกแพลตฟอร์ม
บูตสแตรป
- Go 1.22 ต้องการ Go 1.20 รุ่น point release สุดท้ายหรือใหม่กว่าสำหรับการบูตสแตรป
ไลบรารีหลัก
แพ็กเกจ math/rand/v2 ใหม่
math/rand/v2 เป็นแพ็กเกจ “v2” แรกของ standard library และมีการเปลี่ยนแปลงสำคัญหลายอย่างเมื่อเทียบกับ math/rand
แพ็กเกจ go/version ใหม่
- มีการเพิ่มแพ็กเกจ
go/version ใหม่สำหรับอิมพลีเมนต์ฟังก์ชันตรวจสอบและเปรียบเทียบสตริงเวอร์ชันของ Go
รูปแบบการ routing ที่ดีขึ้น
- การ routing HTTP ใน standard library ถูกปรับปรุงให้มีความยืดหยุ่นในการแสดงรูปแบบมากขึ้น
การเปลี่ยนแปลงเล็กน้อยในไลบรารี
- มีการเปลี่ยนแปลงเล็กน้อยและการปรับปรุงประสิทธิภาพในไลบรารีหลายตัว
พอร์ต
Darwin
- บน macOS สำหรับสถาปัตยกรรม x86 แบบ 64 บิต (
darwin/amd64) ตอนนี้ Go toolchain จะสร้าง position-independent executables (PIE) เป็นค่าเริ่มต้น
Arm
- สามารถใช้ตัวแปรสภาพแวดล้อม
GOARM เพื่อเลือกใช้ซอฟต์แวร์หรือฮาร์ดแวร์ floating point ได้
Loong64
- ตอนนี้พอร์ต
loong64 ส่งอาร์กิวเมนต์และผลลัพธ์ของฟังก์ชันผ่านรีจิสเตอร์
OpenBSD
- มีการเพิ่มพอร์ตทดลองสำหรับ big-endian 64-bit PowerPC (
openbsd/ppc64) บน OpenBSD
ความเห็นของ GN⁺
- การเปิดตัว Go 1.22 ครั้งนี้มีจุดที่น่าสนใจเป็นพิเศษคือการเปลี่ยนแปลงของลูป "for" และการเพิ่มแพ็กเกจ
math/rand/v2 ใหม่ การเปลี่ยนแปลงเหล่านี้ช่วยมอบประสิทธิภาพและความเสถียรที่ดีขึ้นให้กับนักพัฒนา Go และฟีเจอร์ใหม่ ๆ ก็สะท้อนถึงพัฒนาการของภาษา Go
- แพ็กเกจ
math/rand/v2 มอบความสามารถในการสร้างเลขสุ่มที่ดีขึ้นผ่านอัลกอริทึมที่เร็วกว่าและ API ใหม่ ซึ่งเป็นการปรับปรุงสำคัญสำหรับแอปพลิเคชันที่พึ่งพาเลขสุ่ม รวมถึงงานด้านคริปโตกราฟีและงานอื่น ๆ
- คาดว่า Go 1.22 จะส่งผลเชิงบวกต่อชุมชน Go ด้วยการมอบทั้งการเพิ่มประสิทธิภาพและฟีเจอร์ใหม่หลากหลายรูปแบบ พร้อมทั้งยังคงความเข้ากันได้และยกระดับประสบการณ์ของนักพัฒนา
1 ความคิดเห็น
ความเห็นจาก Hacker News
io.Copyสามารถใช้ system callsplice(2)ของ Linux ได้เมื่อคัดลอกจาก TCPConn ไปยัง UnixConn โดยมีผู้ชื่นชมประโยชน์ที่ได้จากแพตเทิร์นลักษณะนี้ในแพ็กเกจiohttpmuxgo121sql.Null[T]เดิมทีพวกเขาใช้nullของsqlboilerซึ่งมี API คล้ายกับsql.NullและยังมีเมธอดIsSet() boolเพิ่มเติมสำหรับบอกว่าค่าถูกตั้งไว้อย่างชัดเจนหรือไม่chiออกได้หรือไม่any