Go เป็นภาษาโปรแกรมที่คอมไพล์พร้อมกันพร้อมการพิมพ์แบบสแตติกที่ได้รับแรงบันดาลใจจากไวยากรณ์ C
Go เวอร์ชัน1.22 เปิดตัวหกเดือนหลังจากเวอร์ชัน 1.21โดยมีการเปลี่ยนแปลงที่สำคัญหลายประการในชุดเครื่องมือ รันไทม์ การปรับปรุงประสิทธิภาพ การพัฒนาคอมไพเลอร์ และไลบรารี
สำหรับผู้ที่ไม่คุ้นเคยกับภาษา Go ผมขออธิบายว่ามันเป็นภาษาโปรแกรมที่ Google กำลังพัฒนาโดยมีส่วนร่วมของชุมชน เป็นโซลูชันแบบไฮบริดที่ผสมผสานประสิทธิภาพสูงของภาษาคอมไพล์เข้ากับข้อดีของภาษาสคริปต์ เช่น ความง่ายในการเขียนโค้ด ความเร็วในการพัฒนา และการป้องกันข้อผิดพลาด
คุณสมบัติใหม่หลักของ Go 1.22
ในเวอร์ชันใหม่นี้ ซึ่งเปิดตัวตั้งแต่ Go 1.22 มีการเปลี่ยนแปลงที่โดดเด่นสองประการเกี่ยวกับลูป "for" ก่อน หน้านี้ ตัวแปรที่ประกาศโดยลูป "for" จะถูกสร้างขึ้นเพียงครั้งเดียวและอัปเดตในแต่ละรอบการวนซ้ำใน Go 1.22 แต่ละรอบการวนซ้ำของลูปจะสร้างตัวแปรใหม่เพื่อป้องกันข้อผิดพลาดจากการแชร์ตัวแปรโดยไม่ได้ตั้งใจ นอกจากนี้ ยังมีการเพิ่มการสนับสนุนแบบทดลอง (GOEXPERIMENT=rangefunc) สำหรับฟังก์ชันช่วงในลูป "for"ซึ่งอนุญาตให้ระบุฟังก์ชันเป็นตัววนซ้ำได้ปัญหาที่เกิดขึ้นมานานเกี่ยวกับลูป "for" ที่ทำให้การเรียกใช้โครูทีนแชร์ตัวแปรลูประหว่างรอบการวนซ้ำก็ได้รับการแก้ไขแล้วเช่นกันยิ่งไปกว่านั้น ตอนนี้ลูป "for" สามารถวนซ้ำกับจำนวนเต็มได้แล้ว ตัวอย่างเช่น:
แพ็คเกจการนำเข้าหลัก "fmt" func main() { สำหรับ i := range 10 { fmt.Println(10 - i) } fmt.Println("go1.22 ถอดออก!") }
การเปลี่ยนแปลงที่สำคัญอีกอย่างในเวอร์ชันใหม่นี้คือการเพิ่มความสามารถในการใช้ไดเร็กทอรี " vendor "ซึ่งประกอบด้วยการพึ่งพาของพื้นที่ทำงาน คำสั่งต่างๆสามารถใช้ไดเร็กทอรีนี้ได้แล้ว โดยไดเร็กทอรีนี้จะถูกสร้างขึ้นด้วยคำสั่ง ` go work vendor`และจะถูกนำไปใช้ในคำสั่ง buildเมื่อตั้งค่า ` -mod`เป็น " vendor " ซึ่งเป็นค่าเริ่มต้นเมื่อมีไดเร็กทอรี " vendor " อยู่ในพื้นที่ทำงาน
โปรดทราบว่า ฟังก์ชัน` go get` ไม่ได้รับการสนับสนุนอีกต่อไปนอกโมดูลใน โหมดGOPATH แบบเก่า อย่างไรก็ตาม คำสั่งสร้างอื่นๆ เช่น`go build` และ `go test` จะยังคงทำงานได้ต่อไปเรื่อยๆ สำหรับโปรแกรม GOPATH แบบเก่า นอกจากนี้ คำสั่ง`go mod init`จะไม่พยายามนำเข้าข้อกำหนดของโมดูลจากไฟล์การกำหนดค่าของ เครื่องมือ ผู้จำหน่าย รายอื่น (เช่น Gopkg.lock) อีกต่อไป
Go 1.22 นำเสนอแพ็กเกจ ใหม่ ชื่อ io/unsafeซึ่งมีฟังก์ชันสำหรับการทำงานกับพอยเตอร์และหน่วยความจำที่ไม่ปลอดภัยแพ็กเกจนี้มีเมธอดสำหรับการแปลงพอยเตอร์จากประเภทปลอดภัยเป็นประเภทไม่ปลอดภัย รวมถึงการดำเนินการคัดลอกหน่วยความจำโดยไม่ต้องตรวจสอบขอบเขต
การพัฒนาการปรับปรุงประสิทธิภาพของคอมไพเลอร์โดยอิงจากผลลัพธ์ของการวิเคราะห์ประสิทธิภาพโค้ด PGO ยังคงดำเนินต่อไป คอมไพเลอร์ ในปัจจุบันใช้เครื่องมือ devirtualization เพื่อแทนที่การเรียกใช้ทางอ้อมจากเมธอดต่างๆ ด้วยการเรียกใช้บล็อกอินไลน์ที่ขยายแล้ว เมื่อเปิดใช้งาน PGO การเปลี่ยนแปลงนี้ช่วยปรับปรุงประสิทธิภาพของโปรแกรมส่วนใหญ่ได้ระหว่าง 2% ถึง 14%
ในGo เวอร์ชัน Windows โปรแกรมที่เชื่อมโยงหรือโหลดไลบรารี Go ที่สร้างด้วย-buildmode=c-archiveหรือ-buildmode=c-shared สามารถใช้ API การบันทึกเหตุการณ์ของ Windows (ETW)ผ่าน แพ็ก เกจ runtime/traceและtracehook ใหม่ ซึ่งใช้งานโปรโตคอลการรวบรวมการติดตามเหตุการณ์ของ Go ในฐานะผู้ให้บริการ ETW ได้แล้ว
การเปลี่ยนแปลงอื่น ๆ ที่โดดเด่น:
- คำสั่ง ไปทดสอบ -cover ตอนนี้พิมพ์สรุปความครอบคลุมสำหรับแพ็คเกจที่ครอบคลุมซึ่งไม่มีไฟล์ทดสอบของตัวเอง
- ระบบปฏิบัติการ/ผู้บริหารมีการเพิ่มความสามารถในการกำหนดแอตทริบิวต์บริบท ทำให้คุณสามารถตั้งค่าต่างๆ เช่น ไดเร็กทอรีการทำงาน ตัวแปรสภาพแวดล้อม และตัวอธิบายไฟล์อินพุต/เอาท์พุตสำหรับคำสั่งที่ดำเนินการ
- เพิ่มประสิทธิภาพการจัดการหน่วยความจำในรันไทม์ ส่งผลให้ประสิทธิภาพเพิ่มขึ้น 1-3% และลดการใช้หน่วยความจำสำหรับแอปพลิเคชันส่วนใหญ่ลง 1%
- บรรจุภัณฑ์ สุทธิ/http, มีการเพิ่มฟังก์ชันแล้ว ปิดการเชื่อมต่อที่ไม่ได้ใช้งาน ไปยังไคลเอนต์ HTTP ซึ่งจะปิดการเชื่อมต่อที่ไม่ได้ใช้งานทั้งหมดที่ไคลเอนต์เพิ่งใช้
- มีการเพิ่มการใช้งานเชิงทดลองที่ได้รับการปรับปรุง (GOEXPERIMENT=newinliner) ของกลไกการแทรกการโทรลงในคอมไพลเลอร์ ซึ่งใช้การวิเคราะห์พฤติกรรมเพื่อแยกการดำเนินการที่สำคัญออกจากการดำเนินการที่ไม่สำคัญ
- เพิ่มแพ็คเกจแล้ว » คณิตศาสตร์/แรนด์/v2 » ไปยังไลบรารีมาตรฐาน ซึ่งมี API ที่สอดคล้องกันมากขึ้น และใช้อัลกอริธึมที่เร็วกว่าเพื่อสร้างตัวเลขสุ่มเทียม
- บรรจุภัณฑ์ net/http.ServeMux เพิ่มความสามารถในการระบุวิธีการและมาสก์ในเทมเพลต
สุดท้ายนี้ หากคุณสนใจเรียนรู้เพิ่มเติมสามารถดูรายละเอียดได้ที่ลิงก์ต่อไปนี้