Skip to content

บันทึกการอัปเดต 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

ระดับภาษา

  1. ลบแนวคิด core type ออกจาก generic ดูบทความทางการ Goodbye core types

ไลบรารีมาตรฐาน

  1. เพิ่ม test/synctest สำหรับทดสอบโค้ดแบบขนาน
  2. เพิ่มไลบรารีทดลอง encoding/json/v2 ประกอบด้วย:
    • encoding/json/v2 ความเร็วในการ deserialize ดีขึ้น 2-10 เท่าเมื่อเทียบกับ v1 ดูการทดสอบประสิทธิภาพที่ go-json-experiment/jsonbench
    • encoding/json/jsontext ให้ความสามารถในการโต้ตอบระดับต่ำกับสตริง json

เครื่องมือ

  1. การเผยแพร่ Go ในอนาคตจะรวมเครื่องมือไบนารีที่สร้างไว้ล่วงหน้าจำนวนเล็กน้อย
  2. go mod เพิ่มคำสั่ง ignore สำหรับระบุโฟลเดอร์ที่คำสั่ง go ควรละเลย
  3. go doc -http สามารถเริ่มต้น http server ในท้องถิ่นเพื่อดูเอกสารโค้ด
  4. go vet เพิ่มตัววิเคราะห์ waitgroup และ hostport
  5. เมื่อ go command อัปเดตเวอร์ชัน go ใน go.mod หรือ go.work จะไม่เพิ่ม go toolchain version ที่ระบุอีกต่อไป

รันไทม์

  1. GOMAXPROCS จะรับรู้ข้อจำกัด CPU ของคอนเทนเนอร์ในสภาพแวดล้อมคอนเทนเนอร์

  2. GC ทดลองรุ่นใหม่ greenteagc หน่วยการจัดกำหนดการพื้นฐานของ GC เปลี่ยนจาก object เป็น memory span

  3. เมื่อ panic ไม่ถูกจับ จะไม่พิมพ์ซ้ำอีกต่อไป

    panic: PANIC [recovered]
      panic: PANIC

    เปลี่ยนเป็น

    panic: PANIC [recovered, repanicked]
  4. เพิ่ม runtime/trace.FlightRecorder สามารถจับข้อมูลการดำเนินการรันไทม์อย่างต่อเนื่องด้วยวิธีที่เบากว่า

คอมไพเลอร์

  1. แก้ไขบักการตรวจสอบ null pointer ล่าช้าของ 1.21 (ล่าช้าไปหลังจากการตรวจสอบข้อผิดพลาด) โค้ดที่มีปัญหาชัดเจนนี้สามารถทำงานได้ปกติในเวอร์ชันก่อน 1.25

    go
    package main
    
    import "os"
    
    func main() {
    	f, err := os.Open("nonExistentFile")
    	name := f.Name()
    	if err != nil {
    		println("should panic") // ก่อน 1.25 จะพิมพ์บรรทัดนี้
    		return
    	}
    	println(name)
    }
  2. คอมไพเลอร์จะสำรองหน่วยความจำสำรองมากขึ้นสำหรับ slice ที่อยู่บนสแต็กเพื่อปรับปรุงประสิทธิภาพการใช้งาน

  3. รองรับการสร้างข้อมูลดีบัก DWARF5

1.24

เผยแพร่ครั้งแรก: 2025-02-11

อัปเดตล่าสุด: go1.24.6 (2025-08-06)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.24 สามารถดูได้ที่ Go 1.24 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.24 - Release Patch

ระดับภาษา

  1. นามแฝงประเภท generic อนุญาตให้สร้างนามแฝงสำหรับประเภท generic ซึ่งมีประโยชน์มากเมื่ออ้างอิงประเภท generic ที่กำหนดโดยบุคคลที่สาม เช่น

    go
    import (
        "other"
    )
    
    type MyQuque[T any] = other.Queue[T]

ไลบรารีมาตรฐาน

  1. เพิ่มแพ็กเกจ weak: ให้ weak pointers อนุญาตให้วัตถุถูกอ้างอิงโดยไม่เพิ่มจำนวนการอ้างอิง ป้องกันการรั่วไหลของหน่วยความจำที่เกิดจากการแคช ต้องตรวจสอบว่า pointer เป็น nil ก่อนใช้งาน
  2. ข้อจำกัดการเข้าถึงระบบไฟล์: แนะนำประเภท os.Root จำกัดการดำเนินการไฟล์ภายในไดเรกทอรีเฉพาะ เพิ่มความปลอดภัย
  3. การสนับสนุนการเข้ารหัสและแฮช: เพิ่มแพ็กเกจ crypto/mlkem, crypto/hkdf, crypto/pbkdf2 และ crypto/sha3 ปรับปรุงประสิทธิภาพอัลกอริทึมการเข้ารหัสที่มีอยู่
  4. เพิ่มฟังก์ชันการทดสอบประสิทธิภาพ testing.B.Loop เพื่อทำการทดสอบลูปได้ดีขึ้น
  5. encoding/json: เพิ่มแท็ก omitzero รองรับกรองค่าศูนย์ตามเมธอด IsZero()
  6. strings และ bytes: เพิ่มฟังก์ชัน iterator (เช่น Lines, SplitSeq, FieldsSeq)

รันไทม์

  1. สร้าง map ในตัวใหม่ตาม Swiss Tables ความเร็วในการเข้าถึง map ขนาดใหญ่เพิ่มขึ้น 30% ความเร็วในการวนซ้ำเพิ่มขึ้น 10%-60%
  2. sync.Map เปลี่ยนไปใช้ concurrent hash trie (hash-trie) เพื่อปรับปรุงประสิทธิภาพ โดยเฉพาะในกรณีที่มีการเขียนแบบขนาน
  3. mutex ภายในรันไทม์ใช้การใช้งาน spinbit ใหม่ ลดการแข่งขันของ lock เพิ่มประสิทธิภาพในสถานการณ์ที่มีการแข่งขันสูง
  4. ปรับปรุงกลยุทธ์การจัดสรรวัตถุขนาดเล็ก ลดความแตกแยกของหน่วยความจำและเวลาหยุด GC
  5. เพิ่ม runtime.AddCleanup แทนที่ runtime.SetFinalizer รองรับฟังก์ชัน cleanup หลายฟังก์ชันสำหรับวัตถุ และดำเนินการตามลำดับใน goroutine แยก

Cgo

  1. รองรับคำอธิบายประกอบ #cgo noescape และ #cgo nocallback ระบุว่าฟังก์ชัน C ไม่หนีหน่วยความจำและไม่เรียกกลับฟังก์ชัน Go เพิ่มประสิทธิภาพรันไทม์
  2. Cgo จะปฏิเสธการคอมไพล์การเรียกฟังก์ชัน C ที่มีคำประกาศที่ไม่เข้ากันได้หลายรายการ ตรวจสอบอย่างเข้มงวดสำหรับการประกาศฟังก์ชัน C ที่ไม่เข้ากันได้ข้ามไฟล์ (เช่น void f(int) และ void f(double)) ป้องกันการสร้างลำดับการเรียกที่ผิดพลาด

เครื่องมือ

  1. การจัดการการพึ่งพาเครื่องมือ: ติดตามการพึ่งพาเครื่องมือผ่านคำสั่ง tool ของ go.mod แทนที่แผนการนำเข้าว่างเปล่า tools.go แบบดั้งเดิม
  2. เอาต์พุตที่มีโครงสร้าง: go build และ go test รองรับแฟลก -json ส่งออกผลการสร้างและการทดสอบในรูปแบบ JSON
  3. การเพิ่มประสิทธิภาพการคอมไพล์และการลิงก์: คอมไพเลอร์สร้างโค้ดที่มีประสิทธิภาพมากขึ้น ลิงเกอร์สร้าง GNU Build ID (แพลตฟอร์ม ELF) และ UUID (macOS) โดยค่าเริ่มต้น
  4. ห้ามใช้ชื่อเล่นเพื่อข้ามข้อจำกัดการกำหนดเมธอดสำหรับประเภทที่สร้างโดย CGO
  5. go build ฝังข้อมูลระบบควบคุมเวอร์ชันลงในไฟล์ไบนารีโดยอัตโนมัติ (รองรับ -buildvcs=false เพื่อปิดใช้งาน)
  6. ตัวแปรสภาพแวดล้อม GOAUTH รองรับรับรองความถูกต้องโมดูลส่วนตัว
  7. go.mod รองรับคำสั่ง tool สำหรับจัดการการพึ่งพาที่ดำเนินการได้ แทนที่การนำเข้าว่างเปล่า tools.go
  8. เพิ่มพารามิเตอร์ go get -tool และคำสั่ง go install tool สำหรับจัดการการพึ่งพาเครื่องมือโมดูล
  9. แคชการสร้างรองรับแคชไบนารีสำหรับ go run และ go tool
  10. objdump รองรับ disassembly LoongArch, RISC-V, S390X
  11. vet เพิ่มตัววิเคราะห์ tests (ตรวจสอบข้อผิดพลาดลายเซ็นฟังก์ชันทดสอบ)

ความเข้ากันได้ของแพลตฟอร์ม

  1. macOS: Go 1.24 เป็นเวอร์ชันสุดท้ายที่รองรับ macOS 11 Big Sur Go 1.25 จะต้องการ macOS 12+
  2. Windows: ทำเครื่องหมายสถาปัตยกรรม ARM 32 บิตว่าไม่สมบูรณ์ (GOOS=windows GOARCH=arm) ดูที่ issue #70705
  3. Linux: ข้อกำหนดเวอร์ชันเคอร์เนลต่ำสุดอัปเดตเป็น 3.2
  4. ต้องการ Go 1.22.6+ เป็นเครื่องมือเริ่มต้น

เลิกใช้

  1. math/rand.Seed() ใช้งานไม่ได้อีกต่อไป ต้องใช้ GODEBUG=randseednop=0 เพื่อคืนค่าพฤติกรรมเก่า
  2. 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

ระดับภาษา

  1. for range รองรับฟังก์ชัน iterator ดูรายละเอียดที่ Go Wiki: Rangefunc Experiment

    go
    func 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

ไลบรารีมาตรฐาน

  1. เพิ่มไลบรารีมาตรฐาน iter กำหนดและอธิบายรายละเอียดเกี่ยวกับ iterator

  2. ไลบรารี maps เพิ่มฟังก์ชัน iterator หลายฟังก์ชัน

  3. ไลบรารี slices เพิ่มฟังก์ชัน iterator หลายฟังก์ชัน

  4. เพิ่มไลบรารี structs ให้ความสามารถในการแก้ไขคุณสมบัติของโครงสร้าง เช่น เค้าโครงหน่วยความจำ

    go
    type Person struct {
      Name string
      Age  int
      _    structs.HostLayout
    }
  5. ปรับปรุงการใช้งานไลบรารีมาตรฐาน time

Linker

  1. จัดการการ滥用 //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

เครื่องมือ

  1. เพิ่มคำสั่ง 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

ระดับภาษา

  1. แก้ไขปัญหาตัวแปรลูปของภาษา go

    go
    func 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 อย่างถูกต้อง

  2. for range ตอนนี้รองรับการวนซ้ำประเภทตัวเลข ดังนี้

    go
    for i := range 10 {
      fmt.Println(i)
    }

ไลบรารีมาตรฐาน

  1. เพิ่มประสิทธิภาพการเราต์ของไลบรารีมาตรฐาน net/http

  2. database/sql เพิ่มประเภท generic sql.Null

    go
    type Null[T any] struct {
      V     T
      Valid bool
    }

    ใช้งานดังนี้

    go
    type 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

ระดับภาษา

  1. เพิ่มฟังก์ชันในตัว min, max สำหรับคำนวณค่าสูงสุดและค่าต่ำสุด

  2. เพิ่มฟังก์ชันในตัว clear สำหรับล้าง map และ slice

  3. อัปเดตลำดับการเริ่มต้น package

    • เรียงลำดับแพ็กเกจทั้งหมดตามพาธการนำเข้า
    • ทำซ้ำจนกว่ารายการแพ็กเกจจะว่างเปล่า
    • ค้นหาแพ็กเกจแรกที่มีการนำเข้าทั้งหมดถูกเริ่มต้นแล้วในรายการ
    • เริ่มต้นแพ็กเกจนั้นและลบออกจากรายการ
  4. ปรับปรุงความสามารถและความแม่นยำของการอนุมานประเภท ส่วนใหญ่เกี่ยวกับ generic

  5. เปิดตัวเวอร์ชันพรีวิวของการปรับปรุงตัวแปรลูป for range นี่เป็นปัญหาที่รบกวนนักพัฒนา Go มาเกือบสิบปี ในที่สุดทางการก็จะแก้ไข ดูรายละเอียดที่: LoopvarExperiment · golang/go Wiki (github.com) และ Proposal: Less Error-Prone Loop Variable Scoping (googlesource.com)

  6. รับประกันว่าค่าส่งคืนของ recover จะไม่เป็น nil หากพารามิเตอร์เป็น nil เมื่อเรียก panic จะทำให้เกิด panic อีกครั้ง ส่งคืน *runtime.PanicNilError เพื่อความเข้ากันได้ ตั้งค่า GODEBUG=panicnil=1 เมื่อคอมไพล์อนุญาตให้ส่ง nil ไปยัง panic

ไลบรารีมาตรฐาน

  1. เพิ่มไลบรารี log/slog ให้ไลบรารีล็อกที่มีโครงสร้างมาตรฐาน
  2. เพิ่มไลบรารี testing/slogtest สำหรับตรวจสอบการใช้งาน slog.Handler
  3. เพิ่มไลบรารี slices ให้ฟังก์ชัน generic หลายฟังก์ชันสำหรับจัดการ slice
  4. เพิ่มไลบรารี maps ให้ฟังก์ชัน generic หลายฟังก์ชันสำหรับจัดการ map
  5. เพิ่มไลบรารี cmp สำหรับเปรียบเทียบประเภทที่มีลำดับ

อื่นๆ

  1. go1.21.0 อย่างน้อยบนระบบ windows ต้องการ win10 หรือ Windows Server 2016 ขึ้นไปจึงจะทำงานได้ ไม่รองรับเวอร์ชันก่อนหน้านี้อีกต่อไป
  2. go1.21.0 อย่างน้อยต้องการ macOS 10.15 Catalina หรือเวอร์ชันที่ใหม่กว่าจึงจะทำงานได้ ไม่รองรับเวอร์ชันก่อนหน้านี้อีกต่อไป
  3. เพิ่ม WebAssembly System Interface แบบทดลอง Go ยังคงสำรวจ WASM อย่างต่อเนื่อง
  4. ใน 1.20 ยังเป็นแบบทดลอง (Profile-guide optimization) PGO (ดูที่ Profile-guided optimization - The Go Programming Language) เวอร์ชัน 1.21 เปิดใช้งานอย่างเป็นทางการ การมีไฟล์ default.pgo ในแพ็กเกจ main จะเปิดใช้งานฟังก์ชันนี้ หลังเปิดใช้งานประสิทธิภาพอาจเพิ่มขึ้น 2%-7%
  5. เมื่อพิมพ์สแต็กการเรียกใช้งานรันไทม์ที่ลึกมาก จากเดิมพิมพ์เฉพาะเฟรมแรกหนึ่งร้อยเฟรม ตอนนี้พิมพ์ 50 เฟรมแรกและ 50 เฟรมสุดท้ายแยกกัน
  6. ปรับปรุงประสิทธิภาพการเรียก CGO บนแพลตฟอร์ม Unix จาก 1-3 ไมโครวินาทีเป็น 100-200 นาโนวินาที
  7. ในเวอร์ชัน 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

ระดับภาษา

  1. เมื่อแปลงประเภท slice เป็น array เดิมต้อง dereference pointer array *(*[4byte])(x) เพื่อหลีกเลี่ยงการทำงานกับ array ฐานเดียวกันกับ slice ตอนนี้สามารถเขียนแบบนี้ได้โดยตรง [4]byte(x)
  2. unsafe เพิ่มฟังก์ชัน SliceData, String, StringData สำหรับสร้างและจัดการ slice และค่าสตริง

ไลบรารีมาตรฐาน

  1. เพิ่มไลบรารี crypto/ecdh ให้การสนับสนุน ECDH (Elliptic Curve Diffie-Hellman วิธีการเข้ารหัสแบบอสมมาตร)
  2. go1.20 ขยายการสนับสนุนการห่อหุ้ม error อนุญาตให้ error ห่อหุ้ม error หลายตัว
  3. เพิ่ม net/http.ResponseController ให้วิธีที่ชัดเจนและค้นพบได้ง่ายขึ้นในการเพิ่ม handler controls แต่ละตัว
  4. httputil.ReverseProxy มีฟังก์ชัน Rewrite Hook ใหม่เพื่อแทนที่ Director Hook ก่อนหน้า

อื่นๆ

  1. go1.20 เป็นเวอร์ชันสุดท้ายที่รองรับ win7, 8, Server2008 และ Server2012 ในเวอร์ชันอนาคตจะไม่รองรับอีกต่อไป
  2. go1.20 เป็นเวอร์ชันสุดท้ายที่รองรับ macOS 10.13 หรือ 10.14 ในเวอร์ชันอนาคตจะไม่รองรับอีกต่อไป
  3. ในเวอร์ชัน 1.18 และ 1.19 เนื่องจากมีการเพิ่ม generic ทำให้ความเร็วในการคอมไพล์ลดลงเมื่อเทียบกับ 1.17 go1.20 ความเร็วในการคอมไพล์จะเพิ่มขึ้นประมาณ 10%
  4. เปิดตัวเวอร์ชันพรีวิว PGO (Profile-guided optimization) นี่เป็นเทคโนโลยีการเพิ่มประสิทธิภาพคอมไพเลอร์ในโลกคอมพิวเตอร์ สามารถปรับปรุงประสิทธิภาพรันไทม์
  5. ใน go1.20 บนระบบที่ไม่มี C toolchains go command จะปิดใช้งาน cgo
  6. รองรับเก็บไฟล์ความครอบคลุมโค้ดโปรแกรม ดูที่ Coverage profiling support for integration tests - The Go Programming Language
  7. ปรับปรุง 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

การเปลี่ยนแปลงสำคัญ

  1. โมเดลหน่วยความจำปรับให้สอดคล้องกับ c/c++ คล้ายกับ TcMollcate

  2. แพ็กเกจ sync/atomic ตอนนี้มีประเภทเพิ่มเติมให้ใช้งาน

  3. รองรับการใช้ฟังก์ชัน runtime/debug.SetMemoryLimit เพื่อจำกัดหน่วยความจำ go อย่างอ่อน ในบางกรณีสามารถเพิ่มประสิทธิภาพการใช้หน่วยความจำ

  4. รันไทม์ตอนนี้จะเลือกขนาดที่เหมาะสมสำหรับการเริ่มต้นหน่วยความจำสแต็กตามการใช้งานสแต็ก goroutine เฉลี่ย这样可以避免频繁的栈扩容缩容

1.18

เผยแพร่ครั้งแรก: 2022-03-15

อัปเดตล่าสุด: go1.18.10 (เผยแพร่ 2023-01-10)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.18 สามารถดูได้ที่ Go 1.18 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.18 - Release Patch

ระดับภาษา

  1. อัปเดตครั้งใหญ่ รองรับ generic, ประเภทเซตอินเทอร์เฟซ, ข้อจำกัดประเภทพารามิเตอร์

อื่นๆ

  1. ปรับปรุงพฤติกรรมการขยายขนาดของฟังก์ชัน append
  2. เพิ่มแพ็กเกจ debug/buildinfo สามารถรับข้อมูลการสร้างโปรแกรม go ได้ในรันไทม์
  3. gofmt ตอนนี้สามารถจัดรูปแบบไฟล์ต้นฉบับแบบขนานได้

1.17

เผยแพร่ครั้งแรก: 2021-08-16

อัปเดตล่าสุด: go1.17.13 (เผยแพร่ 2022-08-01)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.17 สามารถดูได้ที่ Go 1.17 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.17 - Release Patch

ระดับภาษา

  1. เพิ่มฟังก์ชัน unsafe.Add รองรับพีชคณิต pointer
  2. เพิ่มฟังก์ชัน unsafe.Slice รองรับรับ pointer ของ array ฐานของ slice
  3. 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

การเปลี่ยนแปลงสำคัญ

เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้

  1. เลิกใช้แพ็กเกจ ioutil
  2. รองรับการใช้คำสั่ง //go:embed เพื่อฝังไฟล์สถิตบางไฟล์ในโปรแกรม
  3. เพิ่มประเภท 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

การเปลี่ยนแปลงสำคัญ

เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้

  1. ปรับปรุงประสิทธิภาพการจัดสรรวัตถุขนาดเล็ก

  2. เพิ่มแพ็กเกจ time/tzdata รองรับฝังฐานข้อมูลเขตเวลาในโปรแกรมผ่านวิธีต่อไปนี้ เพราะมีหลายระบบไม่มีข้อมูลเขตเวลาในท้องถิ่น

    go
    import _ "time/tzdata"
  3. ปรับปรุงลิงเกอร์ go อย่างมีนัยสำคัญ ลดการใช้ทรัพยากรและเพิ่มความแข็งแกร่งของโค้ด

  4. ในบางกรณี อนุญาตให้แปลง 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

ระดับภาษา

  1. รองรับซ้อนอินเทอร์เฟซประเภทเซตเมธอด

    go
    type MyIO interface {
      io.WriteCloser
    }

อื่นๆ

  1. ใช้การเพิ่มประสิทธิภาพการเข้ารหัสแบบเปิด ค่าใช้จ่ายการเรียก defer ลดลงเกือบเท่ากับการเรียกแบบเนทีฟ
  2. รองรับ preemption แบบอะซิงโครนัสระหว่าง goroutine ลูปที่ไม่มีการเรียกฟังก์ชันจะไม่บล็อกการจัดกำหนดการอย่างถาวรอีกต่อไป

1.13

เผยแพร่ครั้งแรก: 2019-09-03

อัปเดตล่าสุด: go1.13.15 (เผยแพร่ 2020-08-06)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.13 สามารถดูได้ที่ Go 1.13 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.13 - Release Patch

ระดับภาษา

  1. รองรับตัวอักษรตัวเลขที่ทันสมัยกว่า เช่น

    go
    0b101 // ไบนารี
    0o10 // ออกทอล
    0x1B // เฮกซาเดซิมอล

    รองรับขีดล่างแบ่งตัวเลขเพื่อเพิ่มความสามารถในการอ่าน

    go
    10_000

    นามสกุล i ของจำนวนเชิงซ้อนตอนนี้สามารถเป็นตัวเลขไบนารี ออกทอล เฮกซาเดซิมอล หรือจุดลอยตัวใดๆ ก็ได้

อื่นๆ

  1. ค่า GO111MODULE เป็น auto โดยค่าเริ่มต้น
  2. เพิ่มตัวแปรสภาพแวดล้อม GOPRIVATE เพื่อรองรับแหล่งพึ่งพาส่วนตัว
  3. เพิ่มตัวแปรสภาพแวดล้อม GOSUMDB
  4. ค่าใช้จ่ายการใช้ defer ลดลง 30%
  5. เมื่อเกิดดัชนีเกินขอบเขต panic ตอนนี้จะพิมพ์ข้อมูลดัชนี
  6. go จะตรวจสอบเวอร์ชันความหมายเมื่อดาวน์โหลดการพึ่งพา

1.12

เผยแพร่ครั้งแรก: 2019-02-25

อัปเดตล่าสุด: go1.12.17 (เผยแพร่ 2020-02-12)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.12 สามารถดูได้ที่ Go 1.12 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.12 - Release Patch

การเปลี่ยนแปลงสำคัญ

เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้

  1. ปรับปรุงประสิทธิภาพการสแกน heap อย่างมีนัยสำคัญ
  2. รันไทม์จะปล่อยหน่วยความจำที่ขอคืนให้ระบบปฏิบัติการอย่างกระตือรือร้นมากขึ้น
  3. คำสั่งสำหรับดาวน์โหลดการพึ่งพา go ตอนนี้สามารถใช้งานได้อย่างปลอดภัยแบบขนาน

1.11

เผยแพร่ครั้งแรก: 2018-08-24

อัปเดตล่าสุด: go1.11.13 (เผยแพร่ 2019-08-13)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.11 สามารถดูได้ที่ Go 1.11 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.11 - Release Patch

การเปลี่ยนแปลงสำคัญ

เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้

  1. GoMod เปิดตัวครั้งแรก สถานการณ์การจัดการการพึ่งพาที่สับสนก่อนหน้านี้กำลังจะสิ้นสุด
  2. รองรับ WASM แบบทดลองครั้งแรก
  3. รันไทม์ใช้การจัดวาง heap แบบเบาบาง ไม่จำกัดขนาด heap อีกต่อไป

1.10

เผยแพร่ครั้งแรก: 2018-02-16

อัปเดตล่าสุด: go1.10.8 (เผยแพร่ 2019-01-23)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.10 สามารถดูได้ที่ Go 1.10 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.10 - Release Patch

การเปลี่ยนแปลงสำคัญ

เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ที่สำคัญ การเปลี่ยนแปลงที่สำคัญมีดังนี้

  1. คำสั่ง go install ตอนนี้ใช้สำหรับติดตั้งและคอมไพล์เครื่องมือบรรทัดคำสั่งเท่านั้น ไม่ใช้สำหรับดาวน์โหลดการพึ่งพาอีกต่อไป
  2. คำสั่ง go get ตอนนี้ใช้สำหรับดาวน์โหลดการพึ่งพาซอร์สโค้ด
  3. การทดสอบ go ตอนนี้จะแคชผลการทดสอบ และจะรัน go vet โดยอัตโนมัติก่อนรัน
  4. ลดเวลาหน่วงที่เกิดจาก GC เมื่อทำงานอย่างมีนัยสำคัญ

1.9

เผยแพร่ครั้งแรก: 2017-08-24

อัปเดตล่าสุด: go1.9.7 (เผยแพร่ 2018-06-05)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.9 สามารถดูได้ที่ Go 1.9 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.9 - Release Patch

ระดับภาษา

  1. รองรับนามแฝงประเภท

อื่นๆ

  1. รองรับคอมไพล์แบบขนาน
  2. เพิ่ม sync.Map ที่ปลอดภัยแบบขนาน

1.8

เผยแพร่ครั้งแรก: 2017-02-16

อัปเดตล่าสุด: go1.8.7 (เผยแพร่ 2018-02-07)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.8 สามารถดูได้ที่ Go 1.8 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.8 - Release Patch

ระดับภาษา

  1. เมื่อแปลงประเภทระหว่างสองโครงสร้าง จะละเลยความแตกต่างของแท็กโครงสร้าง

    go
    func 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
    }

อื่นๆ

  1. เวลาหยุดที่เกิดจากการเก็บขยะต่ำถึง 10 ไมโครวินาที ส่วนใหญ่ต่ำกว่า 100 ไมโครวินาที (จะเห็นว่าเกือบทุกเวอร์ชัน go พยายามปรับปรุง GC)
  2. ค่าใช้จ่ายการเรียก defer ลดลงเกือบครึ่งหนึ่ง
  3. ค่าใช้จ่ายการเรียก c ของ go ลดลงเกือบครึ่งหนึ่ง
  4. ปรับปรุงการตรวจสอบการใช้ map แบบขนาน

1.7

เผยแพร่ครั้งแรก: 2016-08-15

อัปเดตล่าสุด: go1.7.6 (เผยแพร่ 2017-05-23)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.7 สามารถดูได้ที่ Go 1.7 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.7 - Release Patch

การเปลี่ยนแปลงสำคัญ

  1. เพิ่ม golang.org/x/net/context เข้าในไลบรารีมาตรฐาน
  2. เวลา gc สั้นลงอย่างมีนัยสำคัญเมื่อเทียบกับ 1.6
  3. แพ็กเกจ testing รองรับซับเทสต์

1.6

เผยแพร่ครั้งแรก: 2016-02-17

อัปเดตล่าสุด: go1.6.4 (เผยแพร่ 2016-12-01)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.6 สามารถดูได้ที่ Go 1.6 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.6 - Release Patch

การเปลี่ยนแปลงสำคัญ

เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ การเปลี่ยนแปลงที่สำคัญมีดังนี้

  1. ตรวจสอบการใช้ map แบบขนาน หากตรวจพบว่า map กำลังถูกใช้แบบขนานจะเกิด fatal
  2. เมื่อเกิด panic จะพิมพ์เฉพาะสแต็กการเรียกของ goroutine ที่กำลังทำงานอยู่
  3. รองรับ HTTP/2

1.5

เผยแพร่ครั้งแรก: 2015-08-19

อัปเดตล่าสุด: go1.5.4 (เผยแพร่ 2016-04-12)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.5 สามารถดูได้ที่ Go 1.5 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.5 - Release Patch

ระดับภาษา

  1. เมื่อเริ่มต้นคีย์ของ map literal อนุญาตให้ละเลยประเภทองค์ประกอบ

    go
    m := 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",
    }

อื่นๆ

  1. รันไทม์และคอมไพเลอร์เขียนใหม่ด้วย go ทั้งหมด ไม่รวมโค้ด c อีกต่อไป
  2. รองรับเก็บขยะแบบขนาน ลดเวลาหยุดโปรแกรมอย่างมีนัยสำคัญ
  3. ค่าเริ่มต้นของ GOMAXPROCS เปลี่ยนเป็นจำนวนคอร์เชิงตรรกะของเครื่อง
  4. ความหมายของแพ็กเกจ internal สามารถใช้กับที่ใดก็ได้ ไม่จำกัดเฉพาะแพ็กเกจซอร์สของ go อีกต่อไป
  5. รองรับ vendor การจัดการการพึ่งพาแบบทดลอง (ในที่สุดก็เริ่มจัดการส่วนการจัดการการพึ่งพานี้แล้ว)

1.4

เผยแพร่ครั้งแรก: 2014-12-10

อัปเดตล่าสุด: go1.4.3 (เผยแพร่ 2015-09-22)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.4 สามารถดูได้ที่ Go 1.4 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.4 - Release Patch

ระดับภาษา

  1. ลูป for range สามารถมีพารามิเตอร์การวนซ้ำหนึ่งตัว เช่น

    for i := range x {
        ...
    }

    แต่ไม่สามารถไม่มีได้เลย

  2. เมื่อเรียกเมธอดของประเภทอ้างอิงสองชั้น จะไม่ dereference โดยอัตโนมัติอีกต่อไป

    go
    type T int
    func (T) M() {}
    var x **T
    
    // ไม่ได้รับอนุญาต
    x.M()

อื่นๆ

  1. ก่อน 1.4 รันไทม์ของ go เขียนด้วย c ตอนนี้ทั้งหมดเขียนด้วย go
  2. รองรับเปลี่ยนชื่อแพ็กเกจเป็น internal เพื่อระบุว่าเนื้อหาทั้งหมดของแพ็กเกจนั้นเป็นส่วนตัวไม่สามารถส่งออกได้

1.3

เผยแพร่ครั้งแรก: 2014-06-18

อัปเดตล่าสุด: go1.3.3 (เผยแพร่ 2014-09-30)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.3 สามารถดูได้ที่ Go 1.3 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.3 - Release Patch

การเปลี่ยนแปลงสำคัญ

เวอร์ชันนี้ไม่มีการเปลี่ยนแปลงทางไวยากรณ์ การเปลี่ยนแปลงที่สำคัญมีดังนี้

  1. โมเดลสแต็ก goroutine เปลี่ยนจากสแต็กแบบแบ่งส่วนเป็นสแต็กต่อเนื่อง เพิ่มประสิทธิภาพการขยายขนาดสแต็ก
  2. เพิ่มความแม่นยำในการตัดสิน pointer ของตัวเก็บขยะ
  3. เมื่อวนซ้ำใน map ความจุเล็ก ลำดับจะคาดเดาไม่ได้เช่นกัน
  4. เนื่องจากมีการปรับปรุงรันไทม์บางประการ ประสิทธิภาพโปรแกรม go ในเวอร์ชันปัจจุบันเพิ่มขึ้นอย่างมีนัยสำคัญ

1.2

เผยแพร่ครั้งแรก: 2013-12-01

อัปเดตล่าสุด: go1.2.2 (เผยแพร่ 2014-05-05)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.2 สามารถดูได้ที่ Go 1.2 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.2 - Release Patch

ระดับภาษา

  1. การดำเนินการกับตัวแปรที่มีค่าเป็น nil จะเกิด panic

  2. เมื่อแบ่ง slice สามารถใช้พารามิเตอร์ที่สามเพื่อจำกัดความจุของ slice ที่ถูกแบ่งเพื่อใช้ slice อย่างปลอดภัยมากขึ้น

    go
    var array [10]int
    slice := array[2:4:4]

อื่นๆ

  1. ขนาดหน่วยความจำขั้นต่ำของสแต็ก goroutine เพิ่มจาก 4KB เป็น 8KB

  2. จำกัดจำนวนเธรดสูงสุดที่ 10000

  3. goroutine ที่ทำงานเป็นเวลานานจะถูกแย่งชิงเมื่อเกิดการเรียกฟังก์ชัน (การแนะนำ preemption แบบร่วมมือครั้งแรก)

1.1

เผยแพร่ครั้งแรก: 2013-05-13

อัปเดตล่าสุด: go1.1.2 (เผยแพร่ 2013-08-13)

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.1 สามารถดูได้ที่ Go 1.1 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.1 - Release Patch

ระดับภาษา

  1. ตัวเลขที่ถูกหารด้วย 0 ก่อนหน้านี้จะเกิด panic ใน 1.1 จะไม่สามารถคอมไพล์ได้โดยตรง
  2. เมธอดสามารถเป็นค่าได้
  3. แนะนำแนวคิดของคำสั่งสิ้นสุด กฎการส่งคืนฟังก์ชันผ่อนคลายมากขึ้น คำจำกัดความของคำสั่งสิ้นสุด - go-sepc

ประสิทธิภาพ

  1. ใช้เครื่องมือ go1.1 คอมไพล์โปรแกรม go ประสิทธิภาพสามารถเพิ่มขึ้นประมาณ 30%-40%

อื่นๆ:

  1. ค่าสูงสุดของหน่วยความจำ heap บนเครื่อง 64 บิตเพิ่มขึ้นเป็นหลายสิบ GB
  2. ปิดใช้งาน cgo โดยค่าเริ่มต้นเมื่อครอสคอมไพล์

1.0

เผยแพร่ครั้งแรก: 2012-03-28

บันทึกการอัปเดตโดยละเอียดของเวอร์ชัน go1.0 สามารถดูได้ที่ Go 1.0 Release Notes และเวอร์ชันแพตช์ทั้งหมดที่เผยแพร่ในช่วงการบำรุงรักษาสามารถดูได้ที่ Go1.0 - Release Patch

ระดับภาษา

เมื่อเทียบกับเวอร์ชันพรีวิว มีสิ่งเหล่านี้เพิ่มเข้ามาในไวยากรณ์

  1. เพิ่มฟังก์ชันในตัว append สำหรับเพิ่มองค์ประกอบใน slice

  2. เพิ่มฟังก์ชันในตัว close สำหรับปิด channel

  3. ความหมายเชิงประกอบ เมื่อเริ่มต้นองค์ประกอบ slice, map, structure literal สามารถละเลยประเภทได้ ดังนี้

    go
    // ประกาศประเภท
    holiday1 := []Date{
        Date{"Feb", 14},
        Date{"Nov", 11},
        Date{"Dec", 25},
    }
    
    // ละเลยประเภท
    holiday2 := []Date{
        {"Feb", 14},
        {"Nov", 11},
        {"Dec", 25},
    }
  4. goroutine ที่ใช้ในฟังก์ชัน init จะเริ่มต้นโดยตรง ไม่ต้องรอให้แพ็กเกจทั้งหมดเริ่มต้นเสร็จ

  5. เพิ่มประเภท rune แสดงถึงอักขระ UTF-8 ตัวหนึ่ง

  6. เพิ่มอินเทอร์เฟซในตัว error แสดงถึงประเภทข้อผิดพลาด

  7. เพิ่มฟังก์ชันในตัว delete สำหรับลบคู่คีย์-ค่าใน map

  8. ลำดับการใช้ for range วนซ้ำ map คาดเดาไม่ได้

  9. รองรับกำหนดค่าให้ตัวแปรหลายตัวพร้อมกัน

    a := 1
    b := 2
    a, b = 3, 4
  10. ปัญหาการซ่อนตัวแปร: เมื่อฟังก์ชันมีค่าส่งคืนที่มีชื่อ หากมีค่าส่งคืนใดถูกซ่อน คำสั่ง return ต้องมีค่าส่งคืน มิฉะนั้นจะไม่สามารถคอมไพล์ได้ ต่อไปนี้เป็นตัวอย่างข้อผิดพลาด

    go
    func 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.
    }
  11. อนุญาตให้คัดลอกค่าโครงสร้างที่มีฟิลด์ส่วนตัว

  12. ในกรณีที่โครงสร้างและ 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 เพื่อดูข้อมูลเวอร์ชันสแนปชอตรายสัปดาห์ทั้งหมดของเวอร์ชันพรีวิว

Golang by www.golangdev.cn edit