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 รูปแบบ vMajor.Minor.Patch (ดู 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 ออกจาก generics ดูบทความทางการ Goodbye core types

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

  1. เพิ่ม test/synctest ใช้สำหรับทดสอบโค้ดแบบ concurrent
  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 อัปเดตเวอร์ชัน go ใน go.mod หรือ go.work จะไม่เพิ่มเวอร์ชัน go toolchain ที่ระบุอีกต่อไป

รันไทม์

  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. ชื่อเล่นประเภท generics อนุญาตให้สร้างชื่อเล่นสำหรับประเภท generics ซึ่งมีประโยชน์มากเมื่ออ้างอิงถึงประเภท generics ที่กำหนดโดยบุคคลที่สาม เช่น

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

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

  1. เพิ่มแพ็กเกจ weak: ให้ weak pointers อนุญาตให้วัตถุถูกอ้างอิงโดยไม่เพิ่มจำนวนการอ้างอิง ป้องกันการรั่วไหลของหน่วยความจำที่เกิดจากแคช ต้องตรวจสอบว่า pointer เป็น nil ก่อนใช้งาน
  2. ข้อจำกัดการเข้าถึงระบบไฟล์: แนะนำประเภท os.Root จำกัดการดำเนินการไฟล์ภายในไดเรกทอรีเฉพาะ เพิ่มความปลอดภัย
  3. รองรับ cryptography และ hashing: เพิ่มแพ็กเกจ 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 เพิ่มประสิทธิภาพในสถานการณ์ concurrent สูง
  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 รองรับ authentication สำหรับโมดูลส่วนตัว
  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+ เป็นเครื่องมือ bootstrap

เลิกใช้

  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

    นี่เป็นฟีเจอร์ที่มีประโยชน์มาก โดยทั่วไปจะใช้ร่วมกับ generics

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

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

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

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

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

    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 (released 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. เพิ่มประสิทธิภาพการ routing ของไลบรารีมาตรฐาน net/http

  2. database/sql เพิ่มประเภท generics 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 (released 2024-08-06)

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

ระดับภาษา

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

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

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

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

  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 ให้ไลบรารี log แบบมีโครงสร้างมาตรฐาน
  2. เพิ่มไลบรารี testing/slogtest ใช้สำหรับตรวจสอบการใช้งาน slog.Handler
  3. เพิ่มไลบรารี slices ให้ฟังก์ชัน generics หลายฟังก์ชันสำหรับจัดการ slice
  4. เพิ่มไลบรารี maps ให้ฟังก์ชัน generics หลายฟังก์ชันสำหรับจัดการ 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. เมื่อพิมพ์ call stack รันไทม์ที่ลึกมาก จากเดิมพิมพ์เฉพาะเฟรมแรกหนึ่งร้อยเฟรม ตอนนี้พิมพ์เฟรมแรก 50 เฟรมและเฟรมสุดท้าย 50 เฟรม
  6. ปรับปรุงประสิทธิภาพการเรียก CGO บนแพลตฟอร์ม Unix จาก 1-3 ไมโครวินาทีปรับปรุงเป็น 100-200 นาโนวินาทีในปัจจุบัน
  7. ในเวอร์ชัน 1.21 ความเร็วในการคอมไพล์เพิ่มขึ้นเกือบ 6% ซึ่งส่วนใหญ่เป็นผลมาจากการที่คอมไพเลอร์ใช้ PGO ในการสร้าง

1.20

เผยแพร่ครั้งแรก: 2023-02-01

อัปเดตล่าสุด: go1.20.14 (released 2024-02-06)

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

ระดับภาษา

  1. เมื่อแปลงประเภท slice เป็น array เดิมต้อง dereference pointer array *(*[4byte])(x) เพื่อหลีกเลี่ยงการใช้ underlying 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 เนื่องจากมีการเพิ่ม generics ความเร็วในการคอมไพล์ลดลงเมื่อเทียบกับ 1.17 go1.20 ความเร็วในการคอมไพล์จะเพิ่มขึ้นประมาณ 10%
  4. เผยแพร่เวอร์ชันพรีวิวของ PGO (Profile-guided optimization) นี่เป็นเทคนิคการปรับปรุงคอมไพเลอร์ในโลกคอมพิวเตอร์ที่สามารถเพิ่มประสิทธิภาพรันไทม์
  5. ใน go1.20 บนระบบที่ไม่มี C toolchains คำสั่ง go จะปิดใช้งาน cgo
  6. รองรับรวบรวมไฟล์ความครอบคลุมของโค้ดโปรแกรม ดู Coverage profiling support for integration tests - The Go Programming Language
  7. ปรับปรุง GC เพิ่มความเสถียร ลดการใช้หน่วยความจำ เพิ่มประสิทธิภาพ CPU โดยรวม 2%

1.19

เผยแพร่ครั้งแรก: 2022-08-02

อัปเดตล่าสุด: go1.19.13 (released 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 (released 2023-01-10)

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

ระดับภาษา

  1. การอัปเดตครั้งใหญ่ รองรับ generics, type set interface, ข้อจำกัดประเภทพารามิเตอร์

อื่น ๆ

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

1.17

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

อัปเดตล่าสุด: go1.17.13 (released 2022-08-01)

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

ระดับภาษา

  1. เพิ่มฟังก์ชัน unsafe.Add รองรับ pointer arithmetic
  2. เพิ่มฟังก์ชัน unsafe.Slice รองรับรับ pointer ของ underlying array ของ slice
  3. slice ตอนนี้สามารถแปลงเป็นประเภท pointer array ได้ []T => *[N]T ภายใต้เงื่อนไขที่ความยาวของ array ต้องน้อยกว่าหรือเท่ากับความยาวของ slice

1.16

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

อัปเดตล่าสุด: go1.16.15 (released 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 (released 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 (released 2021-02-04)

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

ระดับภาษา

  1. รองรับ type set interface แบบซ้อนกัน

    go
    type MyIO interface {
      io.WriteCloser
    }

อื่น ๆ

  1. 引用การปรับปรุง open coding ค่าใช้จ่ายการเรียก defer ลดลงเกือบเท่ากับการเรียก native
  2. รองรับ asynchronous preemption ระหว่าง goroutine ลูปที่ไม่มีการเรียกฟังก์ชันจะไม่บล็อกการ schedule อีกต่อไป

1.13

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

อัปเดตล่าสุด: go1.13.15 (released 2020-08-06)

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

ระดับภาษา

  1. รองรับ numeric literal ที่ทันสมัยกว่า เช่น

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

    รองรับ underscore เพื่อแบ่งตัวเลขเพื่อให้สามารถอ่านได้ดีขึ้น

    go
    10_000

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

อื่น ๆ

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

1.12

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

อัปเดตล่าสุด: go1.12.17 (released 2020-02-12)

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

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

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

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

1.11

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

อัปเดตล่าสุด: go1.11.13 (released 2019-08-13)

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

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

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

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

1.10

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

อัปเดตล่าสุด: go1.10.8 (released 2019-01-23)

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

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

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

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

1.9

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

อัปเดตล่าสุด: go1.9.7 (released 2018-06-05)

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

ระดับภาษา

  1. รองรับ type alias

อื่น ๆ

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

1.8

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

อัปเดตล่าสุด: go1.8.7 (released 2018-02-07)

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

ระดับภาษา

  1. เมื่อทำการแปลงประเภทระหว่างสอง struct จะละเว้นความแตกต่างของ struct tag

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

1.7

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

อัปเดตล่าสุด: go1.7.6 (released 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 รองรับ subtests

1.6

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

อัปเดตล่าสุด: go1.6.4 (released 2016-12-01)

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

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

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

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

1.5

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

อัปเดตล่าสุด: go1.5.4 (released 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. รองรับ garbage collection แบบ concurrent ลดเวลาหยุดของโปรแกรมอย่างมาก
  3. ค่าเริ่มต้นของ GOMAXPROCS เปลี่ยนเป็นจำนวน logical core ของเครื่อง
  4. ความหมายของแพ็กเกจ internal สามารถใช้กับที่ใดก็ได้ ไม่จำกัดอยู่แค่แพ็กเกจซอร์สของ go อีกต่อไป
  5. รองรับ vendor dependency management แบบทดลอง (ในที่สุดก็เริ่มจัดการส่วนการจัดการ dependency แล้ว)

1.4

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

อัปเดตล่าสุด: go1.4.3 (released 2015-09-22)

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

ระดับภาษา

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

    for i := range x {
        ...
    }

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

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

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

อื่น ๆ

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

1.3

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

อัปเดตล่าสุด: go1.3.3 (released 2014-09-30)

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

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

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

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

1.2

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

อัปเดตล่าสุด: go1.2.2 (released 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 ที่รันเป็นเวลานานจะถูก preempt เมื่อเกิดการเรียกฟังก์ชัน (การแนะนำ cooperative preemption ครั้งแรก)

1.1

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

อัปเดตล่าสุด: go1.1.2 (released 2013-08-13)

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

ระดับภาษา

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

ด้านประสิทธิภาพ

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

อื่น ๆ:

  1. บนเครื่อง 64-bit ค่าสูงสุดของ heap memory เพิ่มเป็นหลายสิบ GB
  2. ปิดใช้งาน cgo โดยค่าเริ่มต้นเมื่อ cross compile

1.0

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

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

ระดับภาษา

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

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

  2. เพิ่มฟังก์ชัน built-in close สำหรับปิด channel

  3. ความหมายแบบ compound เมื่อเริ่มต้นองค์ประกอบ slice, map, struct 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. เพิ่มอินเทอร์เฟซ built-in error แสดงถึงประเภทข้อผิดพลาด

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

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

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

    a := 1
    b := 2
    a, b = 3, 4
  10. ปัญหาการซ่อนตัวแปร: เมื่อฟังก์ชันมี named return value หากมีค่าส่งคืนใด ๆ ถูกซ่อน คำสั่ง 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. อนุญาตให้คัดลอกค่า struct ที่มีฟิลด์ส่วนตัว

  12. ในกรณีที่ struct และ slice ประกอบด้วยองค์ประกอบที่เปรียบเทียบได้ อนุญาตให้ใช้เป็นคีย์ของ map ในขณะเดียวกันก็ลบความสามารถในการเปรียบเทียบของฟังก์ชันและ map ออก

นอกเหนือจากระดับภาษาแล้ว go1.0 มีการเปลี่ยนแปลงอย่างมากเมื่อเทียบกับเวอร์ชันพรีวิวในด้านการจัดระเบียบแพ็กเกจ ไลบรารีมาตรฐาน และ command line เนื่องจากเนื้อหามากเกินไปที่นี่จะไม่กล่าวถึงโดยละเอียด หากสนใจสามารถไปที่เว็บไซต์ทางการเพื่อดูข้อมูลเพิ่มเติม

pre

ก่อนที่ go1 จะเผยแพร่อย่างเป็นทางการ ทุกเวอร์ชันถูกเรียกว่าเวอร์ชันพรีวิว สำหรับเวอร์ชันพรีวิวเหล่านี้ ทางการจะเผยแพร่เวอร์ชัน snapshot ทุกสัปดาห์ เวอร์ชันที่สำคัญมีดังนี้

  • r60(2011-09-07) กำหนดว่าบล็อก else ตอนนี้ต้องใส่เครื่องหมายวงเล็บ
  • r59(2011-08-01) ออกแบบแผน struct tag ใหม่
  • r58(2011-06-29) แก้ไขปัญหาการใช้ goto มากเกินไปซึ่งทำให้หน่วยความจำไม่ได้เริ่มต้น เพิ่มแพ็กเกจ gui, exec
  • r57(2011-05-03) รองรับไวยากรณ์การกำหนดค่าหลายตัวแปรแบบสั้น ออกแบบแพ็กเกจ http, reflect ใหม่ เปลี่ยน gotest เป็นโปรแกรม go แทน shell script
  • r56(2011-03-07) เวอร์ชันเสถียรแรก

การพัฒนาเวอร์ชันพรีวิวเริ่มต้นเมื่อวันที่ 09 ธันวาคม 2009 หยุดหลังจาก go1 เผยแพร่อย่างเป็นทางการเมื่อวันที่ 28 มีนาคม 2012 ใช้เวลาเกือบสามปี หลังจากนั้นจะไม่บันทึกเวอร์ชัน snapshot รายสัปดาห์อีกต่อไป ไปที่ Pre-Go 1 Release History เพื่อดูข้อมูลเวอร์ชันหลักเหล่านี้ ไปที่ Weekly Snapshot History เพื่อดูข้อมูลเวอร์ชัน snapshot ทุกสัปดาห์ของเวอร์ชันพรีวิวทั้งหมด

Golang by www.golangdev.cn edit