ภาษาโปรแกรม Go เวอร์ชัน 1.22 กำลังจะเปิดตัว Google กำลังพัฒนาโซลูชันไฮบริดที่ผสานรวมประสิทธิภาพสูงของภาษาคอมไพล์เข้ากับข้อดีของภาษาสคริปต์ เช่น การเขียนที่ง่าย การพัฒนาที่รวดเร็ว และการป้องกันข้อผิดพลาด โค้ดของโครงการนี้เผยแพร่ภายใต้ใบอนุญาต BSD
ไวยากรณ์ของ Go อิงจากองค์ประกอบที่คุ้นเคยของภาษา C โดยหยิบยืมบางส่วนมาจาก Oberon ภาษานี้ค่อนข้างกระชับ แต่อ่านและเข้าใจง่าย โค้ดของ Go จะถูกคอมไพล์เป็นไฟล์ปฏิบัติการไบนารีแบบสแตนด์อโลนที่รันแบบเนทีฟ โดยไม่ต้องใช้เครื่องเสมือน (ระบบย่อยสำหรับการทำโปรไฟล์ การดีบัก และระบบตรวจจับปัญหาอื่นๆ ของรันไทม์ถูกรวมเข้าไว้เป็นส่วนประกอบของรันไทม์) ทำให้มีประสิทธิภาพเทียบเท่ากับโปรแกรม C
โครงการนี้ได้รับการออกแบบตั้งแต่เริ่มต้น โดยคำนึงถึงการเขียนโปรแกรมแบบมัลติเธรดและการทำงานอย่างมีประสิทธิภาพบนระบบมัลติคอร์ รวมถึงเครื่องมือระดับผู้ปฏิบัติงานสำหรับการจัดการการคำนวณแบบขนานและการโต้ตอบระหว่างวิธีการทำงานพร้อมกัน ภาษานี้ยังให้การป้องกันในตัวเพื่อป้องกันการล้นหน่วยความจำและรองรับการเก็บขยะ
ท่ามกลางการเปลี่ยนแปลงในรุ่นใหม่:
- เพิ่มการรองรับการกำหนดช่วงของจำนวนเต็มในลูป "for" แล้ว ตัวอย่างเช่น หากต้องการวนซ้ำค่าตั้งแต่ 0 ถึง 9 คุณสามารถใช้ลูป "for i := range 10 {...}" ได้แล้ว
- เพิ่มการรองรับการทดลองสำหรับฟังก์ชันช่วงในลูป "for" (GOEXPERIMENT=rangefunc) ช่วยให้คุณสามารถกำหนดฟังก์ชันเป็นตัววนซ้ำได้ ตัวอย่างเช่น "for i, x := range slices.Backward(s) {…}"
- ปัญหาที่เกิดขึ้นมานานเกี่ยวกับลูป for ที่ทำให้การเรียกใช้ goroutine เพื่อแชร์ตัวแปรลูปข้ามการวนซ้ำได้รับการแก้ไขแล้ว ตัวอย่างเช่น ค่าโค้ด := []string{"a", "b", "c"} สำหรับ _, v := range values { go func() { fmt.Println(v) done <- true }() } จะพิมพ์ "a", "b" และ "c" แทนที่จะพิมพ์แค่ "c" เหมือนก่อนหน้านี้
- มีการดำเนินการเพิ่มประสิทธิภาพการจัดการหน่วยความจำรันไทม์ ส่งผลให้ประสิทธิภาพเพิ่มขึ้น 1-3% และลดการใช้หน่วยความจำลง 1% ในแอปพลิเคชันส่วนใหญ่
- งานยังคงดำเนินต่อไปเกี่ยวกับการนำการเพิ่มประสิทธิภาพแบบโปรไฟล์นำทาง (PGO) มาใช้ในคอมไพเลอร์ โดยคำนึงถึงฟีเจอร์รันไทม์ คอมไพเลอร์เวอร์ชันใหม่ใช้เครื่องมือ devirtualization เพื่อแทนที่การเรียกใช้เมธอดทางอ้อมด้วยการดำเนินการแบบอินไลน์ที่ขยายเพิ่ม
- เมื่อเปิดใช้งาน PGO การเปลี่ยนแปลงเพิ่มเติมจะช่วยปรับปรุงประสิทธิภาพของโปรแกรมส่วนใหญ่ได้ 2-14%
- มีการเพิ่มการใช้งานกลไกการเรียกอินไลน์แบบทดลอง (GOEXPERIMENT=newinliner) ที่ได้รับการปรับปรุงให้กับคอมไพเลอร์ โดยใช้ฮิวริสติกในการแยกการดำเนินการที่สำคัญและไม่สำคัญ
- มีการเพิ่มแพ็คเกจ "math/rand/v2" ลงในไลบรารีมาตรฐาน ซึ่งทำให้มี API ที่มีความสอดคล้องกันมากขึ้นและอัลกอริทึมการสร้างตัวเลขสุ่มเทียมที่รวดเร็วยิ่งขึ้น
- ขณะนี้แพ็กเกจ net/http.ServeMux รองรับการระบุเมธอดและมาสก์ในเทมเพลตแล้ว ตัวอย่างเช่น เทมเพลต "GET /static/{id}/" จะถูกนำไปใช้กับคำขอที่ใช้เมธอด HTTP "GET" และจะเก็บค่าของเซกเมนต์ที่สองของพาธที่ร้องขอไว้ในตัวระบุ "id"
- ขณะนี้แพ็กเกจฐานข้อมูล/sql รองรับชนิด Null[T] แล้ว ซึ่งทำให้สามารถสแกนคอลัมน์ที่อาจเป็นค่าว่างได้ แพ็กเกจ slices มีฟังก์ชัน Concat สำหรับการรวมหลาย slices ทุกประเภท
- ขณะนี้คำสั่งสำหรับการทำงานกับเวิร์กสเปซ (ชุดโมดูล) รองรับการใช้ไดเร็กทอรี "vendor" ซึ่งมีการอ้างอิงเนื้อหาในเวิร์กสเปซ ไดเร็กทอรีนี้จะถูกสร้างขึ้นเมื่อดำเนินการคำสั่ง "go work vendor" และจะถูกใช้ในคำสั่ง build เมื่อระบุตัวเลือก "-mod=vendor" (เปิดใช้งานตามค่าเริ่มต้นหากมีไดเร็กทอรี vendor อยู่)
การเปลี่ยนแปลงพฤติกรรมการใช้งานยูทิลิตี้
- go get ไม่ได้รับการสนับสนุนนอกโมดูลในโหมด GOPATH เดิมอีกต่อไป (เช่น เมื่อ GO111MODULE=off) คำสั่ง build อื่นๆ เช่น go build และ go test จะยังคงทำงานกับโปรแกรม GOPATH เดิมได้เรื่อยๆ
- go mod init จะไม่พยายามนำเข้าข้อกำหนดของโมดูลจากไฟล์กำหนดค่าสำหรับเครื่องมือของผู้จำหน่ายรายอื่นอีกต่อไป (เช่น Gopkg.lock)
- go test -cover จะพิมพ์ข้อมูลสรุปความครอบคลุมสำหรับแพ็กเกจที่ไม่มีไฟล์ทดสอบของตัวเอง ก่อนหน้านี้ Go เวอร์ชัน 1.22 คำสั่ง go test -cover จะรายงานข้อมูลสรุปความครอบคลุมสำหรับแพ็กเกจดังกล่าว: mymod/mypack [ไม่มีไฟล์ทดสอบ]
และตอนนี้ นับตั้งแต่ Go เวอร์ชัน 1.22 เป็นต้นไป ฟังก์ชันต่างๆ ในแพ็คเกจจะถือว่าไม่ได้รับการครอบคลุม: mymod/mypack coverage: 0.0% ของคำสั่ง หมายเหตุ: หากแพ็คเกจไม่มีโค้ดที่ปฏิบัติการได้เลย เราจะไม่สามารถรายงานเปอร์เซ็นต์การครอบคลุมที่มีความหมายได้ สำหรับแพ็คเกจดังกล่าว go test จะยังคงรายงานไฟล์ทดสอบที่หายไปต่อไป
- เว็บอินเทอร์เฟซของเครื่องมือติดตามได้รับการปรับปรุงเล็กน้อยเพื่อเป็นส่วนหนึ่งของการรองรับตัวติดตามใหม่ ปัญหาหลายประการได้รับการแก้ไขและปรับปรุงความสามารถในการอ่านของหน้าต่างๆ ให้ดีขึ้น ขณะนี้เว็บอินเทอร์เฟซรองรับการตรวจสอบการติดตามในมุมมองแบบ thread-safe แล้ว นอกจากนี้ ตัวแสดงการติดตามยังแสดงระยะเวลาการเรียกใช้งานระบบทั้งหมดด้วย การปรับปรุงเหล่านี้มีผลเฉพาะกับการติดตามที่สร้างโดยโปรแกรมที่สร้างด้วย Go เวอร์ชัน 1.22 หรือใหม่กว่าเท่านั้น ในรุ่นถัดไป การปรับปรุงบางส่วนจะนำไปใช้กับการติดตามที่สร้างโดย Go เวอร์ชันเก่า
- ขณะนี้รันไทม์จะจัดเก็บข้อมูลเมตาดาต้าของ Garbage Collection แบบอิงชนิดไว้ใกล้กับแต่ละอ็อบเจ็กต์ฮีปมากขึ้น การเปลี่ยนแปลงนี้ยังช่วยลดพื้นที่หน่วยความจำของโปรแกรม Go ส่วนใหญ่ลงประมาณ 1% ด้วยการขจัดข้อมูลเมตาดาต้าที่ซ้ำซ้อนออกไป การปรับปรุงนี้อาจน้อยลงในบางโปรแกรม เนื่องจากการเปลี่ยนแปลงนี้จะปรับขอบเขตของคลาสขนาดของตัวจัดสรรหน่วยความจำ ดังนั้นอ็อบเจ็กต์บางตัวอาจถูกย้ายไปยังคลาสขนาดที่ใหญ่กว่า ผลที่ตามมาของการเปลี่ยนแปลงนี้คือที่อยู่ของอ็อบเจ็กต์บางตัวที่เคยจัดเรียงบนขอบเขต 16 ไบต์ (หรือสูงกว่า) จะถูกจัดเรียงบนขอบเขต 8 ไบต์เท่านั้น โปรแกรมบางโปรแกรมที่ใช้คำสั่งแอสเซมบลีซึ่งกำหนดให้ต้องจัดเรียงที่อยู่หน่วยความจำที่มีขนาดใหญ่กว่า 8 ไบต์ และอาศัยลักษณะการทำงานแบบเดิมของตัวจัดสรรหน่วยความจำอาจล้มเหลว แต่เราคาดว่าโปรแกรมดังกล่าวจะเกิดขึ้นได้ยาก โปรแกรมดังกล่าวสามารถสร้างได้โดยใช้ GOEXPERIMENT=noallocheaders พร้อมตัวเลือกในการย้อนกลับไปใช้โมเดลเมตาข้อมูลเดิมและคืนสภาพการทำงานการจัดตำแหน่งแบบเดิม แต่เจ้าของแพ็คเกจควรอัปเดตโค้ดแอสเซมเบลอร์ของตนเพื่อหลีกเลี่ยงการสันนิษฐานการจัดตำแหน่ง เนื่องจากแนวทางแก้ปัญหาชั่วคราวนี้จะถูกลบออกในรุ่นถัดไป
- ตามที่กล่าวไว้ในบันทึกประจำรุ่น Go 1.20 ขณะนี้ Go 1.22 จำเป็นต้องใช้ Go เวอร์ชัน 1.20 หรือเวอร์ชันที่ใหม่กว่าสำหรับบิลด์เริ่มต้น เราคาดว่า Go 1.24 จะจำเป็นต้องใช้ Go เวอร์ชัน 1.22 หรือเวอร์ชันที่ใหม่กว่าสำหรับบิลด์เริ่มต้น
ต้นฉบับ (go.dev)
ที่มา: linux.org.ru
