บันทึกการอัปเดต Go
เวอร์ชันบำรุงรักษา:
- go1.25, เผยแพร่ครั้งแรก: 2025-08-12, อัปเดตล่าสุด: go1.25.0 (2025-08-12)
- go1.24, เผยแพร่ครั้งแรก: 2025-02-11, อัปเดตล่าสุด: go1.24.6 (2024-08-06)
บันทึกการอัปเดตทางการของภาษา Go: Release History - The Go Programming Language
Go ทางการใช้ Semantic Versioning สำหรับการระบุเวอร์ชัน รูปแบบคือ vเวอร์ชันหลัก.เวอร์ชันรอง.เวอร์ชันแพตช์ (ดูที่ Semantic Versioning) การอัปเดตเวอร์ชันหลักหมายถึงมีการเปลี่ยนแปลงที่ทำลายความเข้ากันได้ (Breaking Change) ซึ่งไม่สามารถเข้ากันได้กับเวอร์ชันก่อนหน้า การอัปเดตเวอร์ชันรองหมายถึงมีการเพิ่มฟีเจอร์ใหม่และยังคงรักษาความเข้ากันได้กับเวอร์ชันก่อนหน้า การอัปเดตเวอร์ชันแพตช์หมายถึงมีการแก้ไขปัญหาและยังคงรักษาความเข้ากันได้กับเวอร์ชันก่อนหน้า
ทีม Go เผยแพร่เวอร์ชันรองทุกครึ่งปี และมีเพียงสองเวอร์ชันรองล่าสุดเท่านั้นที่ได้รับการบำรุงรักษาระยะยาว เวลาการบำรุงรักษาเป็นเวลาหกเดือน เนื่องจาก Go ทุกการอัปเดตยังคงรักษาความเข้ากันได้สูง แนะนำให้อัปเกรด Go เป็นเวอร์ชันล่าสุดทันทีหลังจากที่เวอร์ชันใหม่มีความเสถียร
Go2.0 มีการเสนอร่างครั้งล่าสุดเมื่อวันที่ 19 พฤศจิกายน 2018 ในขณะนั้นยังอยู่ที่เวอร์ชัน go1.13 หลังจากห้าปี เวอร์ชันได้พัฒนาไปถึง go1.21 แนวคิดต่างๆ ของ Go2.0 ได้ถูกนำไปใช้ใน Go1.0 ผ่านการอัปเดตแบบเพิ่มพูน ผู้ก่อตั้งคนหนึ่งยังได้ระบุอย่างชัดเจนว่าอาจไม่มี Go2.0 ในอนาคต Go จะยังคงพยายามรักษาความเข้ากันได้กับเวอร์ชันก่อนหน้า (ดูที่ Go 1 and the Future of Go Programs)
คำแนะนำ
หน้านี้เป็นเพียงการนำบันทึกทางการมาแสดงอย่างง่าย ไม่ได้มีการอัปเดตเป็นประจำ หากต้องการรับข้อมูลล่าสุดโปรดไปที่เว็บไซต์ทางการ
1.25
เผยแพร่ครั้งแรก: 2025-08-12
อัปเดตล่าสุด: go1.25.0 (2025-08-12)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.25 สามารถดูได้ที่ Go 1.25 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.25 - Release Patch
ระดับภาษา
- ลบแนวคิด core type ออกจาก generic ดูบทความทางการ Goodbye core types
ไลบรารีมาตรฐาน
- เพิ่ม
test/synctestสำหรับทดสอบโค้ดแบบขนาน - เพิ่มไลบรารีทดลอง
encoding/json/v2ประกอบด้วย:encoding/json/v2ความเร็วในการ deserialize ดีขึ้น 2-10 เท่าเมื่อเทียบกับ v1 ดูการทดสอบประสิทธิภาพที่ go-json-experiment/jsonbenchencoding/json/jsontextให้ความสามารถในการโต้ตอบระดับต่ำกับสตริง json
เครื่องมือ
- การเผยแพร่ Go ในอนาคตจะรวมเครื่องมือไบนารีที่สร้างไว้ล่วงหน้าจำนวนเล็กน้อย
- go mod เพิ่มคำสั่ง
ignoreสำหรับระบุโฟลเดอร์ที่คำสั่ง go ควรละเลย go doc -httpสามารถเริ่มต้น http server ในท้องถิ่นเพื่อดูเอกสารโค้ด- go vet เพิ่มตัววิเคราะห์
waitgroupและhostport - เมื่อ go command อัปเดตเวอร์ชัน go ใน
go.modหรือgo.workจะไม่เพิ่ม go toolchain version ที่ระบุอีกต่อไป
รันไทม์
GOMAXPROCS จะรับรู้ข้อจำกัด CPU ของคอนเทนเนอร์ในสภาพแวดล้อมคอนเทนเนอร์
GC ทดลองรุ่นใหม่
greenteagcหน่วยการจัดกำหนดการพื้นฐานของ GC เปลี่ยนจาก object เป็น memory spanเมื่อ panic ไม่ถูกจับ จะไม่พิมพ์ซ้ำอีกต่อไป
panic: PANIC [recovered] panic: PANICเปลี่ยนเป็น
panic: PANIC [recovered, repanicked]เพิ่ม
runtime/trace.FlightRecorderสามารถจับข้อมูลการดำเนินการรันไทม์อย่างต่อเนื่องด้วยวิธีที่เบากว่า
คอมไพเลอร์
แก้ไขบักการตรวจสอบ null pointer ล่าช้าของ 1.21 (ล่าช้าไปหลังจากการตรวจสอบข้อผิดพลาด) โค้ดที่มีปัญหาชัดเจนนี้สามารถทำงานได้ปกติในเวอร์ชันก่อน 1.25
gopackage main import "os" func main() { f, err := os.Open("nonExistentFile") name := f.Name() if err != nil { println("should panic") // ก่อน 1.25 จะพิมพ์บรรทัดนี้ return } println(name) }คอมไพเลอร์จะสำรองหน่วยความจำสำรองมากขึ้นสำหรับ slice ที่อยู่บนสแต็กเพื่อปรับปรุงประสิทธิภาพการใช้งาน
รองรับการสร้างข้อมูลดีบัก DWARF5
1.24
เผยแพร่ครั้งแรก: 2025-02-11
อัปเดตล่าสุด: go1.24.6 (2025-08-06)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.24 สามารถดูได้ที่ Go 1.24 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.24 - Release Patch
ระดับภาษา
นามแฝงประเภท generic อนุญาตให้สร้างนามแฝงสำหรับประเภท generic ซึ่งมีประโยชน์มากเมื่ออ้างอิงประเภท generic ที่กำหนดโดยบุคคลที่สาม เช่น
goimport ( "other" ) type MyQuque[T any] = other.Queue[T]
ไลบรารีมาตรฐาน
- เพิ่มแพ็กเกจ
weak: ให้ weak pointers อนุญาตให้วัตถุถูกอ้างอิงโดยไม่เพิ่มจำนวนการอ้างอิง ป้องกันการรั่วไหลของหน่วยความจำที่เกิดจากการแคช ต้องตรวจสอบว่า pointer เป็นnilก่อนใช้งาน - ข้อจำกัดการเข้าถึงระบบไฟล์: แนะนำประเภท
os.Rootจำกัดการดำเนินการไฟล์ภายในไดเรกทอรีเฉพาะ เพิ่มความปลอดภัย - การสนับสนุนการเข้ารหัสและแฮช: เพิ่มแพ็กเกจ
crypto/mlkem,crypto/hkdf,crypto/pbkdf2และcrypto/sha3ปรับปรุงประสิทธิภาพอัลกอริทึมการเข้ารหัสที่มีอยู่ - เพิ่มฟังก์ชันการทดสอบประสิทธิภาพ
testing.B.Loopเพื่อทำการทดสอบลูปได้ดีขึ้น encoding/json: เพิ่มแท็กomitzeroรองรับกรองค่าศูนย์ตามเมธอดIsZero()stringsและbytes: เพิ่มฟังก์ชัน iterator (เช่นLines,SplitSeq,FieldsSeq)
รันไทม์
- สร้าง map ในตัวใหม่ตาม Swiss Tables ความเร็วในการเข้าถึง map ขนาดใหญ่เพิ่มขึ้น 30% ความเร็วในการวนซ้ำเพิ่มขึ้น 10%-60%
sync.Mapเปลี่ยนไปใช้ concurrent hash trie (hash-trie) เพื่อปรับปรุงประสิทธิภาพ โดยเฉพาะในกรณีที่มีการเขียนแบบขนาน- mutex ภายในรันไทม์ใช้การใช้งาน spinbit ใหม่ ลดการแข่งขันของ lock เพิ่มประสิทธิภาพในสถานการณ์ที่มีการแข่งขันสูง
- ปรับปรุงกลยุทธ์การจัดสรรวัตถุขนาดเล็ก ลดความแตกแยกของหน่วยความจำและเวลาหยุด GC
- เพิ่ม
runtime.AddCleanupแทนที่runtime.SetFinalizerรองรับฟังก์ชัน cleanup หลายฟังก์ชันสำหรับวัตถุ และดำเนินการตามลำดับใน goroutine แยก
Cgo
- รองรับคำอธิบายประกอบ
#cgo noescapeและ#cgo nocallbackระบุว่าฟังก์ชัน C ไม่หนีหน่วยความจำและไม่เรียกกลับฟังก์ชัน Go เพิ่มประสิทธิภาพรันไทม์ - Cgo จะปฏิเสธการคอมไพล์การเรียกฟังก์ชัน C ที่มีคำประกาศที่ไม่เข้ากันได้หลายรายการ ตรวจสอบอย่างเข้มงวดสำหรับการประกาศฟังก์ชัน C ที่ไม่เข้ากันได้ข้ามไฟล์ (เช่น
void f(int)และvoid f(double)) ป้องกันการสร้างลำดับการเรียกที่ผิดพลาด
เครื่องมือ
- การจัดการการพึ่งพาเครื่องมือ: ติดตามการพึ่งพาเครื่องมือผ่านคำสั่ง tool ของ go.mod แทนที่แผนการนำเข้าว่างเปล่า tools.go แบบดั้งเดิม
- เอาต์พุตที่มีโครงสร้าง: go build และ go test รองรับแฟลก -json ส่งออกผลการสร้างและการทดสอบในรูปแบบ JSON
- การเพิ่มประสิทธิภาพการคอมไพล์และการลิงก์: คอมไพเลอร์สร้างโค้ดที่มีประสิทธิภาพมากขึ้น ลิงเกอร์สร้าง GNU Build ID (แพลตฟอร์ม ELF) และ UUID (macOS) โดยค่าเริ่มต้น
- ห้ามใช้ชื่อเล่นเพื่อข้ามข้อจำกัดการกำหนดเมธอดสำหรับประเภทที่สร้างโดย CGO
go buildฝังข้อมูลระบบควบคุมเวอร์ชันลงในไฟล์ไบนารีโดยอัตโนมัติ (รองรับ-buildvcs=falseเพื่อปิดใช้งาน)- ตัวแปรสภาพแวดล้อม
GOAUTHรองรับรับรองความถูกต้องโมดูลส่วนตัว go.modรองรับคำสั่งtoolสำหรับจัดการการพึ่งพาที่ดำเนินการได้ แทนที่การนำเข้าว่างเปล่าtools.go- เพิ่มพารามิเตอร์
go get -toolและคำสั่งgo install toolสำหรับจัดการการพึ่งพาเครื่องมือโมดูล - แคชการสร้างรองรับแคชไบนารีสำหรับ
go runและgo tool objdumpรองรับ disassembly LoongArch, RISC-V, S390Xvetเพิ่มตัววิเคราะห์tests(ตรวจสอบข้อผิดพลาดลายเซ็นฟังก์ชันทดสอบ)
ความเข้ากันได้ของแพลตฟอร์ม
- macOS: Go 1.24 เป็นเวอร์ชันสุดท้ายที่รองรับ macOS 11 Big Sur Go 1.25 จะต้องการ macOS 12+
- Windows: ทำเครื่องหมายสถาปัตยกรรม ARM 32 บิตว่าไม่สมบูรณ์ (GOOS=windows GOARCH=arm) ดูที่ issue #70705
- Linux: ข้อกำหนดเวอร์ชันเคอร์เนลต่ำสุดอัปเดตเป็น 3.2
- ต้องการ Go 1.22.6+ เป็นเครื่องมือเริ่มต้น
เลิกใช้
math/rand.Seed()ใช้งานไม่ได้อีกต่อไป ต้องใช้GODEBUG=randseednop=0เพื่อคืนค่าพฤติกรรมเก่าruntime.GOROOT()ถูกทำเครื่องหมายว่าเลิกใช้ แนะนำให้ใช้go env GOROOTเพื่อรับพาธ
1.23
เผยแพร่ครั้งแรก: 2024-08-13
อัปเดตล่าสุด: go1.23.4 (2024-12-03)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.23 สามารถดูได้ที่ Go 1.23 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.23 - Release Patch
ระดับภาษา
for range รองรับฟังก์ชัน iterator ดูรายละเอียดที่ Go Wiki: Rangefunc Experiment
gofunc Upper(s []string) iter.Seq2[int, string] { return func(yield func(int, string) bool) { for i, s1 := range s { if !yield(i, strings.ToUpper(s1)) { return } } return } } func main() { sl := []string{"hello", "world", "golang"} for i, s := range Upper(sl) { fmt.Printf("%d : %s\n", i, s) } } //0 : HELLO //1 : WORLD //2 : GOLANGนี่เป็นฟีเจอร์ที่ใช้งานได้จริง มักใช้ร่วมกับ generic
ไลบรารีมาตรฐาน
เพิ่มไลบรารีมาตรฐาน
iterกำหนดและอธิบายรายละเอียดเกี่ยวกับ iteratorไลบรารี
mapsเพิ่มฟังก์ชัน iterator หลายฟังก์ชันไลบรารี
slicesเพิ่มฟังก์ชัน iterator หลายฟังก์ชันเพิ่มไลบรารี
structsให้ความสามารถในการแก้ไขคุณสมบัติของโครงสร้าง เช่น เค้าโครงหน่วยความจำgotype Person struct { Name string Age int _ structs.HostLayout }ปรับปรุงการใช้งานไลบรารีมาตรฐาน
time
Linker
จัดการการ滥用
//go:linknameสำหรับ API ที่ถูกอ้างอิงบ่อยๆ ชั่วคราวอนุญาตให้มีอยู่ เช่นruntime.memhash64,runtime.nanotimeเป็นต้น หลังจากนั้นจะไม่อนุญาตการอ้างอิงใหม่อื่นๆgo//go:linkname gcinit runtime.gcinit func gcinit() func main() { gcinit() }โค้ดแบบนี้จะไม่สามารถคอมไพล์ได้
link: main: invalid reference to runtime.gcinit
เครื่องมือ
- เพิ่มคำสั่ง
go telemetryสำหรับจัดการข้อมูล telemetry
1.22
เผยแพร่ครั้งแรก: 2024-02-06
อัปเดตล่าสุด: go1.22.6 (เผยแพร่ 2024-08-06)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.22 สามารถดูได้ที่ Go 1.22 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.22 - Release Patch
ระดับภาษา
แก้ไขปัญหาตัวแปรลูปของภาษา go
gofunc main() { var wg sync.WaitGroup const n = 10 wg.Add(n) for i := 0; i < n; i++ { go func() { fmt.Println(i) wg.Done() }() } wg.Wait() }โค้ดนี้ก่อน 1.22 จะพิมพ์ 9 จำนวน 10 ครั้ง หลัง 1.22 จะพิมพ์ 0 ถึง 9 อย่างถูกต้อง
for rangeตอนนี้รองรับการวนซ้ำประเภทตัวเลข ดังนี้gofor i := range 10 { fmt.Println(i) }
ไลบรารีมาตรฐาน
เพิ่มประสิทธิภาพการเราต์ของไลบรารีมาตรฐาน
net/httpdatabase/sqlเพิ่มประเภท genericsql.Nullgotype Null[T any] struct { V T Valid bool }ใช้งานดังนี้
gotype Person struct { Name sql.Null[string] Age sql.Null[int] }
1.21
เผยแพร่ครั้งแรก: 2023-08-08
อัปเดตล่าสุด: go1.21.13 (เผยแพร่ 2024-08-06)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.21 สามารถดูได้ที่ Go 1.21 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.21 - Release Patch
ระดับภาษา
เพิ่มฟังก์ชันในตัว
min,maxสำหรับคำนวณค่าสูงสุดและค่าต่ำสุดเพิ่มฟังก์ชันในตัว
clearสำหรับล้าง map และ sliceอัปเดตลำดับการเริ่มต้น
package- เรียงลำดับแพ็กเกจทั้งหมดตามพาธการนำเข้า
- ทำซ้ำจนกว่ารายการแพ็กเกจจะว่างเปล่า
- ค้นหาแพ็กเกจแรกที่มีการนำเข้าทั้งหมดถูกเริ่มต้นแล้วในรายการ
- เริ่มต้นแพ็กเกจนั้นและลบออกจากรายการ
ปรับปรุงความสามารถและความแม่นยำของการอนุมานประเภท ส่วนใหญ่เกี่ยวกับ generic
เปิดตัวเวอร์ชันพรีวิวของการปรับปรุงตัวแปรลูป
for rangeนี่เป็นปัญหาที่รบกวนนักพัฒนา Go มาเกือบสิบปี ในที่สุดทางการก็จะแก้ไข ดูรายละเอียดที่: LoopvarExperiment · golang/go Wiki (github.com) และ Proposal: Less Error-Prone Loop Variable Scoping (googlesource.com)รับประกันว่าค่าส่งคืนของ
recoverจะไม่เป็นnilหากพารามิเตอร์เป็นnilเมื่อเรียกpanicจะทำให้เกิดpanicอีกครั้ง ส่งคืน*runtime.PanicNilErrorเพื่อความเข้ากันได้ ตั้งค่าGODEBUG=panicnil=1เมื่อคอมไพล์อนุญาตให้ส่งnilไปยังpanic
ไลบรารีมาตรฐาน
- เพิ่มไลบรารี
log/slogให้ไลบรารีล็อกที่มีโครงสร้างมาตรฐาน - เพิ่มไลบรารี
testing/slogtestสำหรับตรวจสอบการใช้งานslog.Handler - เพิ่มไลบรารี
slicesให้ฟังก์ชัน generic หลายฟังก์ชันสำหรับจัดการ slice - เพิ่มไลบรารี
mapsให้ฟังก์ชัน generic หลายฟังก์ชันสำหรับจัดการ map - เพิ่มไลบรารี
cmpสำหรับเปรียบเทียบประเภทที่มีลำดับ
อื่นๆ
- go1.21.0 อย่างน้อยบนระบบ windows ต้องการ win10 หรือ Windows Server 2016 ขึ้นไปจึงจะทำงานได้ ไม่รองรับเวอร์ชันก่อนหน้านี้อีกต่อไป
- go1.21.0 อย่างน้อยต้องการ macOS 10.15 Catalina หรือเวอร์ชันที่ใหม่กว่าจึงจะทำงานได้ ไม่รองรับเวอร์ชันก่อนหน้านี้อีกต่อไป
- เพิ่ม WebAssembly System Interface แบบทดลอง Go ยังคงสำรวจ WASM อย่างต่อเนื่อง
- ใน 1.20 ยังเป็นแบบทดลอง (Profile-guide optimization) PGO (ดูที่ Profile-guided optimization - The Go Programming Language) เวอร์ชัน 1.21 เปิดใช้งานอย่างเป็นทางการ การมีไฟล์
default.pgoในแพ็กเกจ main จะเปิดใช้งานฟังก์ชันนี้ หลังเปิดใช้งานประสิทธิภาพอาจเพิ่มขึ้น 2%-7% - เมื่อพิมพ์สแต็กการเรียกใช้งานรันไทม์ที่ลึกมาก จากเดิมพิมพ์เฉพาะเฟรมแรกหนึ่งร้อยเฟรม ตอนนี้พิมพ์ 50 เฟรมแรกและ 50 เฟรมสุดท้ายแยกกัน
- ปรับปรุงประสิทธิภาพการเรียก CGO บนแพลตฟอร์ม Unix จาก 1-3 ไมโครวินาทีเป็น 100-200 นาโนวินาที
- ในเวอร์ชัน 1.21 ความเร็วในการคอมไพล์เพิ่มขึ้นเกือบ 6% ส่วนใหญ่ต้องขอบคุณคอมไพเลอร์เองที่ใช้ PGO ในการสร้าง
1.20
เผยแพร่ครั้งแรก: 2023-02-01
อัปเดตล่าสุด: go1.20.14 (เผยแพร่ 2024-02-06)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.20 สามารถดูได้ที่ Go 1.20 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.20 - Release Patch
ระดับภาษา
- เมื่อแปลงประเภท slice เป็น array เดิมต้อง dereference pointer array
*(*[4byte])(x)เพื่อหลีกเลี่ยงการทำงานกับ array ฐานเดียวกันกับ slice ตอนนี้สามารถเขียนแบบนี้ได้โดยตรง[4]byte(x) unsafeเพิ่มฟังก์ชันSliceData,String,StringDataสำหรับสร้างและจัดการ slice และค่าสตริง
ไลบรารีมาตรฐาน
- เพิ่มไลบรารี
crypto/ecdhให้การสนับสนุน ECDH (Elliptic Curve Diffie-Hellman วิธีการเข้ารหัสแบบอสมมาตร) - go1.20 ขยายการสนับสนุนการห่อหุ้ม error อนุญาตให้ error ห่อหุ้ม error หลายตัว
- เพิ่ม
net/http.ResponseControllerให้วิธีที่ชัดเจนและค้นพบได้ง่ายขึ้นในการเพิ่ม handler controls แต่ละตัว httputil.ReverseProxyมีฟังก์ชัน Rewrite Hook ใหม่เพื่อแทนที่ Director Hook ก่อนหน้า
อื่นๆ
- go1.20 เป็นเวอร์ชันสุดท้ายที่รองรับ win7, 8, Server2008 และ Server2012 ในเวอร์ชันอนาคตจะไม่รองรับอีกต่อไป
- go1.20 เป็นเวอร์ชันสุดท้ายที่รองรับ macOS 10.13 หรือ 10.14 ในเวอร์ชันอนาคตจะไม่รองรับอีกต่อไป
- ในเวอร์ชัน 1.18 และ 1.19 เนื่องจากมีการเพิ่ม generic ทำให้ความเร็วในการคอมไพล์ลดลงเมื่อเทียบกับ 1.17 go1.20 ความเร็วในการคอมไพล์จะเพิ่มขึ้นประมาณ 10%
- เปิดตัวเวอร์ชันพรีวิว PGO (Profile-guided optimization) นี่เป็นเทคโนโลยีการเพิ่มประสิทธิภาพคอมไพเลอร์ในโลกคอมพิวเตอร์ สามารถปรับปรุงประสิทธิภาพรันไทม์
- ใน go1.20 บนระบบที่ไม่มี C toolchains go command จะปิดใช้งาน cgo
- รองรับเก็บไฟล์ความครอบคลุมโค้ดโปรแกรม ดูที่ Coverage profiling support for integration tests - The Go Programming Language
- ปรับปรุง GC เพิ่มความเสถียร ลดการใช้หน่วยความจำ เพิ่มประสิทธิภาพ CPU โดยรวม 2%
1.19
เผยแพร่ครั้งแรก: 2022-08-02
อัปเดตล่าสุด: go1.19.13 (เผยแพร่ 2023-09-06)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.19 สามารถดูได้ที่ Go 1.19 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.19 - Release Patch
การเปลี่ยนแปลงสำคัญ
โมเดลหน่วยความจำปรับให้สอดคล้องกับ c/c++ คล้ายกับ TcMollcate
แพ็กเกจ
sync/atomicตอนนี้มีประเภทเพิ่มเติมให้ใช้งานรองรับการใช้ฟังก์ชัน
runtime/debug.SetMemoryLimitเพื่อจำกัดหน่วยความจำ go อย่างอ่อน ในบางกรณีสามารถเพิ่มประสิทธิภาพการใช้หน่วยความจำรันไทม์ตอนนี้จะเลือกขนาดที่เหมาะสมสำหรับการเริ่มต้นหน่วยความจำสแต็กตามการใช้งานสแต็ก goroutine เฉลี่ย这样可以避免频繁的栈扩容缩容
1.18
เผยแพร่ครั้งแรก: 2022-03-15
อัปเดตล่าสุด: go1.18.10 (เผยแพร่ 2023-01-10)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.18 สามารถดูได้ที่ Go 1.18 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.18 - Release Patch
ระดับภาษา
- อัปเดตครั้งใหญ่ รองรับ generic, ประเภทเซตอินเทอร์เฟซ, ข้อจำกัดประเภทพารามิเตอร์
อื่นๆ
- ปรับปรุงพฤติกรรมการขยายขนาดของฟังก์ชัน
append - เพิ่มแพ็กเกจ
debug/buildinfoสามารถรับข้อมูลการสร้างโปรแกรม go ได้ในรันไทม์ - gofmt ตอนนี้สามารถจัดรูปแบบไฟล์ต้นฉบับแบบขนานได้
1.17
เผยแพร่ครั้งแรก: 2021-08-16
อัปเดตล่าสุด: go1.17.13 (เผยแพร่ 2022-08-01)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.17 สามารถดูได้ที่ Go 1.17 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.17 - Release Patch
ระดับภาษา
- เพิ่มฟังก์ชัน
unsafe.Addรองรับพีชคณิต pointer - เพิ่มฟังก์ชัน
unsafe.Sliceรองรับรับ pointer ของ array ฐานของ slice - slice ตอนนี้สามารถแปลงเป็นประเภท pointer array ได้
[]T => *[N]Tเงื่อนไขคือความยาวของ array ต้องน้อยกว่าหรือเท่ากับความยาวของ slice
1.16
เผยแพร่ครั้งแรก: 2021-02-16
อัปเดตล่าสุด: go1.16.15 (เผยแพร่ 2022-03-03)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.16 สามารถดูได้ที่ Go 1.16 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.16 - Release Patch
การเปลี่ยนแปลงสำคัญ
เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้
- เลิกใช้แพ็กเกจ
ioutil - รองรับการใช้คำสั่ง
//go:embedเพื่อฝังไฟล์สถิตบางไฟล์ในโปรแกรม - เพิ่มประเภท
io/fs.Fsทำให้มีการนามธรรมระบบไฟล์ที่ดีขึ้น
1.15
เผยแพร่ครั้งแรก: 2020-08-11
อัปเดตล่าสุด: go1.15.15 (เผยแพร่ 2021-08-05)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.15 สามารถดูได้ที่ Go 1.15 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.15 - Release Patch
การเปลี่ยนแปลงสำคัญ
เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้
ปรับปรุงประสิทธิภาพการจัดสรรวัตถุขนาดเล็ก
เพิ่มแพ็กเกจ
time/tzdataรองรับฝังฐานข้อมูลเขตเวลาในโปรแกรมผ่านวิธีต่อไปนี้ เพราะมีหลายระบบไม่มีข้อมูลเขตเวลาในท้องถิ่นgoimport _ "time/tzdata"ปรับปรุงลิงเกอร์ go อย่างมีนัยสำคัญ ลดการใช้ทรัพยากรและเพิ่มความแข็งแกร่งของโค้ด
ในบางกรณี อนุญาตให้แปลง
unsafe.Pointerเป็นuintptr
1.14
เผยแพร่ครั้งแรก: 2020-02-25
อัปเดตล่าสุด: go1.14.15 (เผยแพร่ 2021-02-04)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.14 สามารถดูได้ที่ Go 1.14 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.14 - Release Patch
ระดับภาษา
รองรับซ้อนอินเทอร์เฟซประเภทเซตเมธอด
gotype MyIO interface { io.WriteCloser }
อื่นๆ
- ใช้การเพิ่มประสิทธิภาพการเข้ารหัสแบบเปิด ค่าใช้จ่ายการเรียก
deferลดลงเกือบเท่ากับการเรียกแบบเนทีฟ - รองรับ preemption แบบอะซิงโครนัสระหว่าง goroutine ลูปที่ไม่มีการเรียกฟังก์ชันจะไม่บล็อกการจัดกำหนดการอย่างถาวรอีกต่อไป
1.13
เผยแพร่ครั้งแรก: 2019-09-03
อัปเดตล่าสุด: go1.13.15 (เผยแพร่ 2020-08-06)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.13 สามารถดูได้ที่ Go 1.13 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.13 - Release Patch
ระดับภาษา
รองรับตัวอักษรตัวเลขที่ทันสมัยกว่า เช่น
go0b101 // ไบนารี 0o10 // ออกทอล 0x1B // เฮกซาเดซิมอลรองรับขีดล่างแบ่งตัวเลขเพื่อเพิ่มความสามารถในการอ่าน
go10_000นามสกุล
iของจำนวนเชิงซ้อนตอนนี้สามารถเป็นตัวเลขไบนารี ออกทอล เฮกซาเดซิมอล หรือจุดลอยตัวใดๆ ก็ได้
อื่นๆ
- ค่า
GO111MODULEเป็นautoโดยค่าเริ่มต้น - เพิ่มตัวแปรสภาพแวดล้อม
GOPRIVATEเพื่อรองรับแหล่งพึ่งพาส่วนตัว - เพิ่มตัวแปรสภาพแวดล้อม
GOSUMDB - ค่าใช้จ่ายการใช้
deferลดลง 30% - เมื่อเกิดดัชนีเกินขอบเขต
panicตอนนี้จะพิมพ์ข้อมูลดัชนี - go จะตรวจสอบเวอร์ชันความหมายเมื่อดาวน์โหลดการพึ่งพา
1.12
เผยแพร่ครั้งแรก: 2019-02-25
อัปเดตล่าสุด: go1.12.17 (เผยแพร่ 2020-02-12)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.12 สามารถดูได้ที่ Go 1.12 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.12 - Release Patch
การเปลี่ยนแปลงสำคัญ
เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้
- ปรับปรุงประสิทธิภาพการสแกน heap อย่างมีนัยสำคัญ
- รันไทม์จะปล่อยหน่วยความจำที่ขอคืนให้ระบบปฏิบัติการอย่างกระตือรือร้นมากขึ้น
- คำสั่งสำหรับดาวน์โหลดการพึ่งพา go ตอนนี้สามารถใช้งานได้อย่างปลอดภัยแบบขนาน
1.11
เผยแพร่ครั้งแรก: 2018-08-24
อัปเดตล่าสุด: go1.11.13 (เผยแพร่ 2019-08-13)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.11 สามารถดูได้ที่ Go 1.11 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.11 - Release Patch
การเปลี่ยนแปลงสำคัญ
เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้
- GoMod เปิดตัวครั้งแรก สถานการณ์การจัดการการพึ่งพาที่สับสนก่อนหน้านี้กำลังจะสิ้นสุด
- รองรับ WASM แบบทดลองครั้งแรก
- รันไทม์ใช้การจัดวาง heap แบบเบาบาง ไม่จำกัดขนาด heap อีกต่อไป
1.10
เผยแพร่ครั้งแรก: 2018-02-16
อัปเดตล่าสุด: go1.10.8 (เผยแพร่ 2019-01-23)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.10 สามารถดูได้ที่ Go 1.10 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.10 - Release Patch
การเปลี่ยนแปลงสำคัญ
เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้
- คำสั่ง
go installตอนนี้ใช้สำหรับติดตั้งและคอมไพล์เครื่องมือบรรทัดคำสั่งเท่านั้น ไม่ใช้สำหรับดาวน์โหลดการพึ่งพาอีกต่อไป - คำสั่ง
go getตอนนี้ใช้สำหรับดาวน์โหลดการพึ่งพาซอร์สโค้ด - การทดสอบ go ตอนนี้จะแคชผลการทดสอบ และจะรัน
go vetโดยอัตโนมัติก่อนรัน - ลดเวลาหน่วงที่เกิดจาก GC เมื่อทำงานอย่างมีนัยสำคัญ
1.9
เผยแพร่ครั้งแรก: 2017-08-24
อัปเดตล่าสุด: go1.9.7 (เผยแพร่ 2018-06-05)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.9 สามารถดูได้ที่ Go 1.9 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.9 - Release Patch
ระดับภาษา
- รองรับนามแฝงประเภท
อื่นๆ
- รองรับคอมไพล์แบบขนาน
- เพิ่ม
sync.Mapที่ปลอดภัยแบบขนาน
1.8
เผยแพร่ครั้งแรก: 2017-02-16
อัปเดตล่าสุด: go1.8.7 (เผยแพร่ 2018-02-07)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.8 สามารถดูได้ที่ Go 1.8 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.8 - Release Patch
ระดับภาษา
เมื่อแปลงประเภทระหว่างสองโครงสร้าง จะละเลยความแตกต่างของแท็กโครงสร้าง
gofunc example() { type T1 struct { X int `json:"foo"` } type T2 struct { X int `json:"bar"` } var v1 T1 var v2 T2 v1 = T1(v2) // now legal }
อื่นๆ
- เวลาหยุดที่เกิดจากการเก็บขยะต่ำถึง 10 ไมโครวินาที ส่วนใหญ่ต่ำกว่า 100 ไมโครวินาที (จะเห็นว่าเกือบทุกเวอร์ชัน go พยายามปรับปรุง GC)
- ค่าใช้จ่ายการเรียก
deferลดลงเกือบครึ่งหนึ่ง - ค่าใช้จ่ายการเรียก c ของ go ลดลงเกือบครึ่งหนึ่ง
- ปรับปรุงการตรวจสอบการใช้ map แบบขนาน
1.7
เผยแพร่ครั้งแรก: 2016-08-15
อัปเดตล่าสุด: go1.7.6 (เผยแพร่ 2017-05-23)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.7 สามารถดูได้ที่ Go 1.7 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.7 - Release Patch
การเปลี่ยนแปลงสำคัญ
- เพิ่ม
golang.org/x/net/contextเข้าในไลบรารีมาตรฐาน - เวลา gc สั้นลงอย่างมีนัยสำคัญเมื่อเทียบกับ 1.6
- แพ็กเกจ
testingรองรับซับเทสต์
1.6
เผยแพร่ครั้งแรก: 2016-02-17
อัปเดตล่าสุด: go1.6.4 (เผยแพร่ 2016-12-01)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.6 สามารถดูได้ที่ Go 1.6 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.6 - Release Patch
การเปลี่ยนแปลงสำคัญ
เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ การเปลี่ยนแปลงที่สำคัญมีดังนี้
- ตรวจสอบการใช้ map แบบขนาน หากตรวจพบว่า map กำลังถูกใช้แบบขนานจะเกิด
fatal - เมื่อเกิด
panicจะพิมพ์เฉพาะสแต็กการเรียกของ goroutine ที่กำลังทำงานอยู่ - รองรับ HTTP/2
1.5
เผยแพร่ครั้งแรก: 2015-08-19
อัปเดตล่าสุด: go1.5.4 (เผยแพร่ 2016-04-12)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.5 สามารถดูได้ที่ Go 1.5 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.5 - Release Patch
ระดับภาษา
เมื่อเริ่มต้นคีย์ของ map literal อนุญาตให้ละเลยประเภทองค์ประกอบ
gom := map[Point]string{ Point{29.935523, 52.891566}: "Persepolis", Point{-25.352594, 131.034361}: "Uluru", Point{37.422455, -122.084306}: "Googleplex", } // ละเลยประเภท m := map[Point]string{ {29.935523, 52.891566}: "Persepolis", {-25.352594, 131.034361}: "Uluru", {37.422455, -122.084306}: "Googleplex", }
อื่นๆ
- รันไทม์และคอมไพเลอร์เขียนใหม่ด้วย go ทั้งหมด ไม่รวมโค้ด c อีกต่อไป
- รองรับเก็บขยะแบบขนาน ลดเวลาหยุดโปรแกรมอย่างมีนัยสำคัญ
- ค่าเริ่มต้นของ
GOMAXPROCSเปลี่ยนเป็นจำนวนคอร์เชิงตรรกะของเครื่อง - ความหมายของแพ็กเกจ
internalสามารถใช้กับที่ใดก็ได้ ไม่จำกัดเฉพาะแพ็กเกจซอร์สของ go อีกต่อไป - รองรับ vendor การจัดการการพึ่งพาแบบทดลอง (ในที่สุดก็เริ่มจัดการส่วนการจัดการการพึ่งพานี้แล้ว)
1.4
เผยแพร่ครั้งแรก: 2014-12-10
อัปเดตล่าสุด: go1.4.3 (เผยแพร่ 2015-09-22)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.4 สามารถดูได้ที่ Go 1.4 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.4 - Release Patch
ระดับภาษา
ลูป
for rangeสามารถมีพารามิเตอร์การวนซ้ำหนึ่งตัว เช่นfor i := range x { ... }แต่ไม่สามารถไม่มีได้เลย
เมื่อเรียกเมธอดของประเภทอ้างอิงสองชั้น จะไม่ dereference โดยอัตโนมัติอีกต่อไป
gotype T int func (T) M() {} var x **T // ไม่ได้รับอนุญาต x.M()
อื่นๆ
- ก่อน 1.4 รันไทม์ของ go เขียนด้วย c ตอนนี้ทั้งหมดเขียนด้วย go
- รองรับเปลี่ยนชื่อแพ็กเกจเป็น
internalเพื่อระบุว่าเนื้อหาทั้งหมดของแพ็กเกจนั้นเป็นส่วนตัวไม่สามารถส่งออกได้
1.3
เผยแพร่ครั้งแรก: 2014-06-18
อัปเดตล่าสุด: go1.3.3 (เผยแพร่ 2014-09-30)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.3 สามารถดูได้ที่ Go 1.3 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.3 - Release Patch
การเปลี่ยนแปลงสำคัญ
เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ การเปลี่ยนแปลงที่สำคัญมีดังนี้
- โมเดลสแต็ก goroutine เปลี่ยนจากสแต็กแบบแบ่งส่วนเป็นสแต็กต่อเนื่อง เพิ่มประสิทธิภาพการขยายขนาดสแต็ก
- เพิ่มความแม่นยำในการตัดสิน pointer ของตัวเก็บขยะ
- เมื่อวนซ้ำใน map ความจุเล็ก ลำดับจะคาดเดาไม่ได้เช่นกัน
- เนื่องจากมีการปรับปรุงรันไทม์บางประการ ประสิทธิภาพโปรแกรม go ในเวอร์ชันปัจจุบันเพิ่มขึ้นอย่างมีนัยสำคัญ
1.2
เผยแพร่ครั้งแรก: 2013-12-01
อัปเดตล่าสุด: go1.2.2 (เผยแพร่ 2014-05-05)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.2 สามารถดูได้ที่ Go 1.2 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.2 - Release Patch
ระดับภาษา
การดำเนินการกับตัวแปรที่มีค่าเป็น
nilจะเกิดpanicเมื่อแบ่ง slice สามารถใช้พารามิเตอร์ที่สามเพื่อจำกัดความจุของ slice ที่ถูกแบ่งเพื่อใช้ slice อย่างปลอดภัยมากขึ้น
govar array [10]int slice := array[2:4:4]
อื่นๆ
ขนาดหน่วยความจำขั้นต่ำของสแต็ก goroutine เพิ่มจาก 4KB เป็น 8KB
จำกัดจำนวนเธรดสูงสุดที่ 10000
goroutine ที่ทำงานเป็นเวลานานจะถูกแย่งชิงเมื่อเกิดการเรียกฟังก์ชัน (การแนะนำ preemption แบบร่วมมือครั้งแรก)
1.1
เผยแพร่ครั้งแรก: 2013-05-13
อัปเดตล่าสุด: go1.1.2 (เผยแพร่ 2013-08-13)
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.1 สามารถดูได้ที่ Go 1.1 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.1 - Release Patch
ระดับภาษา
- ตัวเลขที่ถูกหารด้วย 0 ก่อนหน้านี้จะเกิด
panicใน 1.1 จะไม่สามารถคอมไพล์ได้โดยตรง - เมธอดสามารถเป็นค่าได้
- แนะนำแนวคิดของคำสั่งสิ้นสุด กฎการส่งคืนฟังก์ชันผ่อนคลายมากขึ้น คำจำกัดความของคำสั่งสิ้นสุด - go-sepc
ประสิทธิภาพ
- ใช้เครื่องมือ go1.1 คอมไพล์โปรแกรม go ประสิทธิภาพสามารถเพิ่มขึ้นประมาณ 30%-40%
อื่นๆ:
- ค่าสูงสุดของหน่วยความจำ heap บนเครื่อง 64 บิตเพิ่มขึ้นเป็นหลายสิบ GB
- ปิดใช้งาน cgo โดยค่าเริ่มต้นเมื่อครอสคอมไพล์
1.0
เผยแพร่ครั้งแรก: 2012-03-28
บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.0 สามารถดูได้ที่ Go 1.0 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.0 - Release Patch
ระดับภาษา
เมื่อเทียบกับเวอร์ชันพรีวิว มีสิ่งเหล่านี้เพิ่มเข้ามาในไวยากรณ์
เพิ่มฟังก์ชันในตัว
appendสำหรับเพิ่มองค์ประกอบใน sliceเพิ่มฟังก์ชันในตัว
closeสำหรับปิด channelความหมายเชิงประกอบ เมื่อเริ่มต้นองค์ประกอบ slice, map, structure literal สามารถละเลยประเภทได้ ดังนี้
go// ประกาศประเภท holiday1 := []Date{ Date{"Feb", 14}, Date{"Nov", 11}, Date{"Dec", 25}, } // ละเลยประเภท holiday2 := []Date{ {"Feb", 14}, {"Nov", 11}, {"Dec", 25}, }goroutine ที่ใช้ในฟังก์ชัน
initจะเริ่มต้นโดยตรง ไม่ต้องรอให้แพ็กเกจทั้งหมดเริ่มต้นเสร็จเพิ่มประเภท
runeแสดงถึงอักขระ UTF-8 ตัวหนึ่งเพิ่มอินเทอร์เฟซในตัว
errorแสดงถึงประเภทข้อผิดพลาดเพิ่มฟังก์ชันในตัว
deleteสำหรับลบคู่คีย์-ค่าใน mapลำดับการใช้
for rangeวนซ้ำ map คาดเดาไม่ได้รองรับกำหนดค่าให้ตัวแปรหลายตัวพร้อมกัน
a := 1 b := 2 a, b = 3, 4ปัญหาการซ่อนตัวแปร: เมื่อฟังก์ชันมีค่าส่งคืนที่มีชื่อ หากมีค่าส่งคืนใดถูกซ่อน คำสั่ง
returnต้องมีค่าส่งคืน มิฉะนั้นจะไม่สามารถคอมไพล์ได้ ต่อไปนี้เป็นตัวอย่างข้อผิดพลาดgofunc Bug() (i, j, k int) { for i = 0; i < 5; i++ { for j := 0; j < 5; j++ { // Redeclares j. k += i * j if k > 100 { return // Rejected: j is shadowed here. } } } return // OK: j is not shadowed here. }อนุญาตให้คัดลอกค่าโครงสร้างที่มีฟิลด์ส่วนตัว
ในกรณีที่โครงสร้างและ slice ประกอบด้วยองค์ประกอบที่เปรียบเทียบได้ อนุญาตให้ใช้เป็นคีย์ของ map ในขณะเดียวกันก็ลบความสามารถในการเปรียบเทียบของฟังก์ชันและ map
นอกจากกระดับภาษาแล้ว go1.0 ยังมีการเปลี่ยนแปลงอย่างมากเมื่อเทียบกับเวอร์ชันพรีวิวในด้านการจัดระเบียบแพ็กเกจ ไลบรารีมาตรฐาน และบรรทัดคำสั่ง เนื่องจากเนื้อหามากเกินไป จึงไม่ขอกล่าวถึงที่นี่โดยละเอียด หากสนใจสามารถไปที่เว็บไซต์ทางการเพื่อเรียนรู้เพิ่มเติม
pre
ก่อนที่ go1 จะเผยแพร่อย่างเป็นทางการ เวอร์ชันทั้งหมดถูกเรียกว่าเวอร์ชันพรีวิว สำหรับเวอร์ชันพรีวิวเหล่านี้ ทางการจะเผยแพร่เวอร์ชันสแนปชอตทุกสัปดาห์ เวอร์ชันที่สำคัญมีดังนี้
- r60(2011-09-07) กำหนดว่าบล็อก else ตอนนี้ต้องมีวงเล็บ
- r59(2011-08-01) ออกแบบแผนแท็กโครงสร้างใหม่
- r58(2011-06-29) แก้ไขปัญหาการใช้ goto มากเกินไปจนทำให้หน่วยความจำไม่ได้เริ่มต้น เพิ่มแพ็กเกจ gui, exec
- r57(2011-05-03) รองรับไวยากรณ์การกำหนดค่าตัวแปรสั้นหลายตัว ออกแบบแพ็กเกจ http, reflect ใหม่ เปลี่ยน gotest เป็นโปรแกรม go แทนสคริปต์ shell
- r56(2011-03-07) เวอร์ชันเสถียรแรก
การพัฒนาเวอร์ชันพรีวิวเริ่มต้นเมื่อวันที่ 09 ธันวาคม 2009 หยุดหลังจาก go1 เผยแพร่อย่างเป็นทางการเมื่อวันที่ 28 มีนาคม 2012 ใช้เวลาเกือบสามปี หลังจากนั้นจะไม่บันทึกเวอร์ชันสแนปชอตรายสัปดาห์อีกต่อไป ไปที่ Pre-Go 1 Release History เพื่อดูข้อมูลเวอร์ชันหลักเหล่านี้ ไปที่ Weekly Snapshot History เพื่อดูข้อมูลเวอร์ชันสแนปชอตรายสัปดาห์ทั้งหมดของเวอร์ชันพรีวิว
