1 คะแนน โดย GN⁺ 2024-02-08 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2024-02-08
ความเห็นจาก Hacker News
  • นักพัฒนา TypeScript คนหนึ่งแชร์ประสบการณ์การย้ายมาใช้ภาษา Go เมื่อไม่นานมานี้ ตอนแรกเขากังวลเรื่องการขาดฟังก์ชันสำหรับอาร์เรย์ใน Go และระบบชนิดข้อมูลที่ไม่ยืดหยุ่นนัก แต่เมื่อได้ใช้งานจริงก็รู้สึกถึงข้อดีของ standard library ที่ยอดเยี่ยม ความปลอดภัยของชนิดข้อมูล และมาตรฐานการเขียนโค้ดที่มีมาในตัว อีกทั้งยังมองว่าการรวม routing เข้าไว้ใน standard library เป็นเรื่องที่ดี
  • มีการแชร์ลิงก์ไปยัง release note แบบโต้ตอบได้ของ Go 1.22
  • นักพัฒนาที่ใช้ Go มานานกว่า 9 ปีเปรียบเทียบ Dart (สำหรับพัฒนา Flutter) กับ Go โดยมองว่า Dart พยายามเพิ่มทุกฟีเจอร์ที่เป็นไปได้ ในขณะที่ Go เดินในทางตรงกันข้ามคือมุ่งสู่ความเรียบง่าย ใน Dart วิธีการ initialze class มีหลายแบบจนทำให้สับสน และทำให้คิดถึงความเรียบง่ายของ Go นอกจากนี้ single expression ที่ซับซ้อนโดยใช้ map/stream ของ Dart อาจทำให้สับสนเวลาต้องดีบักหรือสำหรับนักพัฒนามือใหม่
  • ตอนนี้ io.Copy สามารถใช้ system call splice(2) ของ Linux ได้เมื่อคัดลอกจาก TCPConn ไปยัง UnixConn โดยมีผู้ชื่นชมประโยชน์ที่ได้จากแพตเทิร์นลักษณะนี้ในแพ็กเกจ io
  • รูปแบบ routing ใน Go 1.22 ได้รับการปรับปรุง แต่ก็อาจทำให้เกิดปัญหาความเข้ากันได้เล็กน้อย ซึ่งสามารถควบคุมได้ผ่านฟิลด์ httpmuxgo121
  • นักพัฒนาบางคนไม่ชอบฟีเจอร์ 'ขอบเขตระดับฟังก์ชัน' ที่เพิ่มเข้ามาในภาษา เพราะมองว่ามันให้ความสะดวกไม่คุ้มกับความซับซ้อนที่เพิ่มขึ้น และไม่เข้ากับสไตล์ที่ชัดเจนและเรียบง่ายของ Go
  • มีการแชร์ลิงก์การอภิปรายเกี่ยวกับการที่แต่ละรอบของลูปใน Go 1.22 จะสร้างตัวแปรใหม่
  • หลายคนยินดีกับการเพิ่ม sql.Null[T] เดิมทีพวกเขาใช้ null ของ sqlboiler ซึ่งมี API คล้ายกับ sql.Null และยังมีเมธอด IsSet() bool เพิ่มเติมสำหรับบอกว่าค่าถูกตั้งไว้อย่างชัดเจนหรือไม่
  • มีผู้ยินดีกับการเพิ่ม routing เข้ามาใน standard library และกำลังพิจารณาว่าจะถอดไลบรารี chi ออกได้หรือไม่
  • ในหมู่นักพัฒนาที่ใช้ Go ในโปรดักชัน มีคำถามว่าควรอัปเกรดไปใช้เวอร์ชันใหม่อย่างรวดเร็วหรือคงอยู่กับรีลีสเก่า ๆ รวมถึงมีการแลกเปลี่ยนความเห็นเกี่ยวกับการใช้คีย์เวิร์ด any