fbpx
维基百科

Go

Go(又稱Golang[4])是Google開發的一种静态强类型編譯型并发型,并具有垃圾回收功能的编程语言

Go
编程范型編譯型可平行化結構化指令式
設計者羅伯特·格瑞史莫英语Robert Griesemer
羅勃·派克
肯·汤普逊
實作者Google
发行时间2009年11月10日,​13年前​(2009-11-10
目前版本
  • 1.20 (2023年2月1日;穩定版本)[1]
作業系統LinuxmacOSFreeBSDWindows
許可證BSD
文件扩展名.go
網站https://go.dev/
https://golang.google.cn/[2]
主要實作產品
gc (8g,6g,5g),gccgo
啟發語言
COberonLimboNewsqueak[3]
Gopher(囊鼠科),Go的吉祥物

羅伯特·格瑞史莫英语Robert Griesemer羅勃·派克肯·汤普逊於2007年9月开始设计Go,[3]稍後伊恩·蘭斯·泰勒(Ian Lance Taylor)、拉斯·考克斯(Russ Cox)加入專案。Go是基於Inferno作業系統所開發的。[5]Go於2009年11月正式宣布推出,成為開放原始碼專案,支援LinuxmacOSWindows等作業系統。[6]

在2016年,Go被軟體評價公司TIOBE英语TIOBE Programming Community Index選為「TIOBE 2016年最佳語言」。[7]

目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。


描述

Go的语法接近C语言,但对于变量的声明英语type declaration有所不同。Go支持垃圾回收功能。Go的并行计算模型是以東尼·霍爾通信顺序进程(CSP)为基础,采取类似模型的其他语言包括OccamLimbo[3],Go也具有这个模型的特征,比如通道传输。通过goroutine和通道等并行构造可以建造线程池管道[8]。在1.8版本中開放插件(Plugin)的支持,這意味著現在能從Go中動態載入部分函式。

与C++相比,Go並不包括如枚举异常处理继承泛型(此功能在go1.18中加入)、断言虚函数等功能,但增加了切片(Slice) 型、并发、管道、垃圾回收接口等特性的语言级支持[3]。對於断言的存在,則持負面態度,同時也為自己不提供型別继承來辯護。

不同于Java,Go原生提供了关联数组(也称为哈希表(Hashes)或字典(Dictionaries))。

批評

儘管 Go 的官方與支持者對於語言中不使用泛型異常處理有著大量辯解說詞,但批評聲也從未停過。在發表 Go 語言 2.0 的草案時,官方稱沒有泛型異常處理模組對於 Go 發展造成很大的阻礙[9],等同承認 Go 沒有這些特色是設計錯誤。

Go 的垃圾回收機制一直被人詬病,直到 1.8 版本垃圾回收的功能才較為穩定。然而儘管如此,Go 的垃圾回收還是遠遠落後 JVM 的 G1 和 ZGC。Discord 的研發團隊在2020年初甚至發表一篇部落格,宣布把其中一個服務由從 Go 轉移至 Rust,理由是 Go 的垃圾回收會導致每2分鐘出現一次卡頓,並且 Discord 研發團隊測試了 Go 語言的1.8、1.9、1.10版本這個問題都沒有改善[10]

历史

2007年,Google设计Go,目的在于提高在多核、网络机器(networked machines)、大型代码库(codebases)的情况下的开发效率。[11]当时在Google,设计师们想要解决其他语言使用中的缺点,但是仍保留他们的优点。[12]

设计师们主要受他们之间流传的“不要像C++”启发。[14][15][16]

Go於2009年11月正式宣布推出,[17]版本1.0在2012年3月发布。[18][19]之后,Go广泛应用于Google的产品[20]以及许多其他组织和开源项目。

在2016年11月,Go(一种无衬线体)和Go Mono 字体(一种等宽字体)分别由设计师查爾斯·比格洛英语Charles Bigelow克莉絲·荷姆斯英语Kris Holmes发布。两种字体均采用了WGL4英语WGL4,并且依照着 DIN 1450 标准,可清晰地使用了 large x-height 和 letterforms 。[21][22]

在2018年8月,原生的图标更换了。待描述完整 然而,Gopher mascot 仍旧命相同的名字。[23]

在2018年8月,Go的主要贡献者发布了两个关于语言新功能的“草稿设计——泛型异常处理,同时寻求Go用户的反馈。[24][25]Go 由于在1.x时,缺少对泛型编程的支持和冗长的异常处理而备受批评。

版本历史

主要版本 发布日期 语言改动[26] 其他改动
1 – 1.0.3 2012-03-28 初始版本
1.11 – 1.11.6 2018-08-24
  • Go 1.11 增加 WebAssembly 的实验入口。
  • Go 1.11 初次支持新概念 “modules”, 是 GOPATH 的代替品,并支持版本和包的分发。
  • Go 1.11 停止支持 Windows XP 和 Windows Vista.
  • Go 1.11.3 以及之后会修复 crypto/x509 包的 TLS 认证的脆弱性(vulnerability) .
1.12.1 2019-02-25
  • Opt-in 对TLS 1.3支持
  • 增强对 modules 的支持( 为在 Go 1.13 称为默认选择做准备)
  • 支持 windows/arm
  • 提高 macOS & iOS 向前兼容
1.13.1 2019-09-03
  • Go 已支持更统一和更现代化的 数字字义前缀 (number literal英语Integer literal prefixes )
  • crypto/tls 包中对TLS 1.3 的支持。(Go 1.14 将会移除 opt-out)
  • 支持错误包装(Error wrapping)


代码示例

Hello World

下面是用Go写成的Hello World程序:

package main import "fmt" func main() {  fmt.Println("Hello, World") } 

HTTP網頁伺服器

透過Go僅需幾行程式碼就完成HTTP網頁伺服器的實現:

package main import (  "io"  "net/http" ) func hello(w http.ResponseWriter, r *http.Request) {  io.WriteString(w, "Hello world!") } func main() {  http.HandleFunc("/", hello)  http.ListenAndServe(":8000", nil) } 

Echo命令程序

下面的例子说明了怎样用Go去实现一个像Unix中的Echo命令程序[27]

package main import (  "os"  "flag" ) var omitNewline = flag.Bool("n", false, "don't print final newline") const (  Space = " "  Newline = "\n" ) func main() {  flag.Parse() // Scans the arg list and sets up flags  var s string = ""  for i := 0; i < flag.NArg(); i++ {  if i > 0 {  s += Space  }  s += flag.Arg(i)  }  if !*omitNewline {  s += Newline  }  os.Stdout.WriteString(s) } 

语言特征

撰寫風格

Go有定義如下的撰寫風格:

  1. 每行程式結束後不需要撰寫分號;
  2. 大括號{不能夠換行放置。
  3. if判斷式和for迴圈不需要以小括號包覆起來。
  4. 使用 tab 做排版

除了第二點外(換行會產生編譯錯誤),在不符合上述規定時,仍舊可以編譯,但使用了內建gofmt工具後,會自動整理程式碼,使之符合規定的撰寫風格。

專案架構

module

Go 採用 module 的概念(於 go1.11才開始啟用[28],舊版本請參閱工作區),每個專案都是一個 module ,而每個 module 底下會有個 go.mod 的檔案,來管理該 module 所引用的外部庫、開發版本……等等。

一個 module 的資料夾目錄可能如下

go.mod hello/ hello.go outyet/ main.go main_test.go # 測試用的程式 stringutil/ reverse.go reverse_test.go # 測試用的程式 bmp/ reader.go writer.go 

然後 go.mod 的內容可能為

<code>module example.org/go-mod-sample go 1.11 require ( github.com/golang/example v0.0.0-20220412213650-2e68773dfca0 golang.org/x/image v0.1.0 )</code>

工作區

Go的工作區英语Workspace位於GOPATH,其目录結構如下[29]

src pkg bin

三個目录的用途分別為

目录 用途
src 引用的外部
pkg 編譯時,生成的對象文件英语Object file
bin 編譯後的程式

舉例來說,整個專案目录可能會如下:

bin/ hello # 生成的執行檔 outyet # 生成的執行檔 pkg/ linux_amd64/ github.com/golang/example/ stringutil.a # 編譯時,生成的對象檔案 src/ github.com/golang/example/ .git/ # 外部 Git 庫的詮釋資料 hello/ hello.go # Git 庫的程式碼 outyet/ main.go # Git 庫的程式碼 main_test.go # Git 庫的程式碼(測試用的程式) stringutil/ reverse.go # Git 庫的程式碼 reverse_test.go # Git 庫的程式碼(測試用的程式) golang.org/x/image/ .git/ # 外部 Git 庫的詮釋資料 bmp/ reader.go # Git 庫的程式碼 writer.go # Git 庫的程式碼 

轻型协程

Go的主要特色在於易于使用的併行設計,叫做Goroutine,透過Goroutine能夠讓程式以異步的方式執行,而不需要擔心一個函式導致程式中斷,因此Go也非常地適合網路服務。假設有個程式,裡面有兩個函式:

func main() {  // 假設 loop 是一個會重複執行十次的迴圈函式。  // 迴圈執行完畢才會往下執行。  loop()  // 執行另一個迴圈。  loop() } 

這個時候透過Go讓其中一個函式同步執行,如此就不需要等待該函式執行完後才能執行下一個函式。

func main() {  // 透過 `go`,我們可以把這個函式同步執行,  // 如此一來這個函式就不會阻塞主程式的執行。  go loop()  // 執行另一個迴圈。  loop() } 

Goroutine是類似線程的概念,属于纖程(区别于协程线程)。線程屬於系統層面,通常來說建立一個新的線程會消耗較多的資源且管理不易;而协程的主要作用是提供在一個線程內的併發性,卻不能利用多個处理器線程。而 Goroutine就像輕量級的線程,一個Go程式可以執行超過數萬個 Goroutine[30],並且這些效能都是原生級的,隨時都能夠關閉、結束,且運行在多個處理器執行緒上。一個核心裡面可以有多個Goroutine,透過GOMAXPROCS參數你能夠限制Gorotuine可以佔用幾個系統線程來避免失控。

在內建的官方套件中也不時能夠看見Goroutine的應用,像是net/http中用來監聽網路服務的函式實際上是建立一個不斷執行迴圈的Goroutine;同时搭配了epoll 等IO多路复用機制维护Goroutine的事件循环

编译器

当前有两个Go编译器分支,分别为官方编译器gc和gccgo。官方编译器在初期使用C写成,后用Go重写从而实现自举英语Bootstrapping (compilers)[31]。Gccgo是一个使用标准GCC作为后端的Go编译器[32]

官方编译器支持跨平台编译(但不支持CGO),允许将原始码编译为可在目标系统、架构上执行的二进制文件。

參考文獻

  1. ^ 1.0 1.1 go1.20 (released 2023-02-01). 2023年2月1日 [2023年2月1日]. 
  2. ^ . [2020-09-14]. (原始内容存档于2021-08-14). 
  3. ^ 3.0 3.1 3.2 3.3 Language Design FAQ. [2009-11-12]. (原始内容于2013-01-02). 
  4. ^ Google-go-language. [2018-05-07]. (原始内容于2020-11-28). 
  5. ^ goyacc.go: Derived from Inferno's utils/iyacc/yacc.c. [2009-11-20]. (原始内容于2010-08-02). 
  6. ^ Installing Go. [2009-11-12]. (原始内容于2012-03-20). 
  7. ^ 存档副本. [2018-09-17]. (原始内容于2018-09-17). 
  8. ^ Go Concurrency Patterns. golang.org. [2020-05-07]. (原始内容于2021-02-05). 
  9. ^ . [2021-03-15]. (原始内容存档于2021-01-26). 
  10. ^ . [2021-03-15]. (原始内容存档于2022-05-11). 
  11. ^ Go at Google: Language Design in the Service of Software Engineering. [2018-10-08]. (原始内容于2021-01-25). 
  12. ^ Pike, Rob. Another Go at Language Design. Stanford EE Computer Systems Colloquium. Stanford University. 2010-04-28 [2020-01-14]. (原始内容于2014-06-12).  Video available (页面存档备份,存于互联网档案馆).
  13. ^ Frequently Asked Questions (FAQ) - The Go Programming Language. golang.org. [2016-02-26]. (原始内容于2017-02-25). 
  14. ^ Andrew Binstock. Dr. Dobb's: Interview with Ken Thompson. 2011-05-18 [2014-02-07]. (原始内容于2014-03-13). 
  15. ^ Pike, Rob. Less is exponentially more. 2012 [2020-01-14]. (原始内容于2016-03-21). 
  16. ^ Robert Griesemer. The Evolution of Go. 2015 [2020-01-14]. (原始内容于2017-01-16). 
  17. ^ Griesemer, Robert; Pike, Rob; Thompson, Ken; Taylor, Ian; Cox, Russ; Kim, Jini; Langley, Adam. Hey! Ho! Let's Go!. Google Open Source. Google. [2018-05-17]. (原始内容于2021-01-26). 
  18. ^ Shankland, Stephen. Google's Go language turns one, wins a spot at YouTube: The lower-level programming language has matured enough to sport the 1.0 version number. And it's being used for real work at Google.. News. CNet (CBS Interactive Inc). March 30, 2012 [2017-08-06]. (原始内容于2020-11-25). Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++. 
  19. ^ Release History. [2014-12-11]. (原始内容于2017-02-17). 
  20. ^ Go FAQ: Is Google using Go internally?. [2013-03-09]. (原始内容于2017-02-25). 
  21. ^ Go fonts – The Go Blog. Go. 2016-11-16 [2019-03-12]. (原始内容于2019-07-31). 
  22. ^ Go Font TTFs. GitHub. Google. [2019-04-02]. (原始内容于2019-07-31). 
  23. ^ Go's New Brand – The Go Blog. blog.golang.org. [2018-11-09]. (原始内容于2020-11-25). 
  24. ^ Go 2 Draft Designs. [2018-09-12]. (原始内容于2021-01-26). 
  25. ^ The Go Blog: Go 2 Draft Designs. 2018-08-28 [2020-01-14]. (原始内容于2021-01-31). 
  26. ^ Release History - The Go Programming Language. golang.org. [2018-08-24]. (原始内容于2017-02-17). 
  27. ^ 存档副本. [2009-11-20]. (原始内容存档于2013-07-08). 
  28. ^ Go 1.11 Release Notes. The Go Programming Language. [2022-11-18]. (原始内容于2023-01-03). 
  29. ^ How to Write Go Code. The Go Programming Language. [2017-11-15]. (原始内容于2019-02-13) (英语). 
  30. ^ Max number of goroutines. stackoverflow.com. [2017-03-20]. (原始内容于2020-11-25). 
  31. ^ Google公布实现Go 1.5自举的计划. [2015-06-09]. (原始内容于2018-08-07). 
  32. ^ Go FAQ: Implementation. [2009-11-12]. (原始内容于2013-01-02). 

外部連結

  • 官方网站  
  • Golang FAQ(页面存档备份,存于互联网档案馆
  • Golang Release History and Support (页面存档备份,存于互联网档案馆
  • YouTube上的The Go Programming Language
  • IRC:#go-nuts IRC://(irc.freenode.net)
  • 邮件列表Archive.is的存檔,存档日期2019-03-14


此条目或章节需要時常更新, 內容可能會隨著時間而有所變化或進展, 未有可靠来源的臆測內容可能會被移除, 若您發現有尚未更新的內容, 歡迎您編輯更新, 此條目可参照英語維基百科相應條目来扩充, 若您熟悉来源语言和主题, 请协助参考外语维基百科扩充条目, 请勿直接提交机械翻译, 也不要翻译不可靠, 低品质内容, 依版权协议, 译文需在编辑摘要注明来源, 或于讨论页顶部标记, href, template, translated, page, html, title, template, translated, page. 此条目或章节需要時常更新 內容可能會隨著時間而有所變化或進展 未有可靠来源的臆測內容可能會被移除 若您發現有尚未更新的內容 歡迎您編輯更新 此條目可参照英語維基百科相應條目来扩充 若您熟悉来源语言和主题 请协助参考外语维基百科扩充条目 请勿直接提交机械翻译 也不要翻译不可靠 低品质内容 依版权协议 译文需在编辑摘要注明来源 或于讨论页顶部标记 a href Template Translated page html title Template Translated page Translated page a 标签 Go 又稱Golang 4 是Google開發的一种静态强类型 編譯型 并发型 并具有垃圾回收功能的编程语言 Go编程范型編譯型 可平行化 結構化 指令式設計者羅伯特 格瑞史莫 英语 Robert Griesemer 羅勃 派克肯 汤普逊實作者Google发行时间2009年11月10日 13年前 2009 11 10 目前版本1 20 2023年2月1日 穩定版本 1 作業系統Linux macOS FreeBSD Windows許可證BSD文件扩展名 go網站https go dev https golang google cn 2 主要實作產品gc 8g 6g 5g gccgo啟發語言C Oberon Limbo Newsqueak 3 Gopher 囊鼠科 Go的吉祥物 羅伯特 格瑞史莫 英语 Robert Griesemer 羅勃 派克及肯 汤普逊於2007年9月开始设计Go 3 稍後伊恩 蘭斯 泰勒 Ian Lance Taylor 拉斯 考克斯 Russ Cox 加入專案 Go是基於Inferno作業系統所開發的 5 Go於2009年11月正式宣布推出 成為開放原始碼專案 支援Linux macOS Windows等作業系統 6 在2016年 Go被軟體評價公司TIOBE 英语 TIOBE Programming Community Index 選為 TIOBE 2016年最佳語言 7 目前 Go每半年发布一个二级版本 即从a x 升级到a y 目录 1 描述 2 批評 3 历史 3 1 版本历史 4 代码示例 4 1 Hello World 4 2 HTTP網頁伺服器 4 3 Echo命令程序 5 语言特征 5 1 撰寫風格 5 2 專案架構 5 2 1 module 5 2 2 工作區 5 3 轻型协程 6 编译器 7 參考文獻 8 外部連結描述 编辑Go的语法接近C语言 但对于变量的声明 英语 type declaration 有所不同 Go支持垃圾回收功能 Go的并行计算模型是以東尼 霍爾的通信顺序进程 CSP 为基础 采取类似模型的其他语言包括Occam和Limbo 3 Go也具有这个模型的特征 比如通道传输 通过goroutine和通道等并行构造可以建造线程池和管道等 8 在1 8版本中開放插件 Plugin 的支持 這意味著現在能從Go中動態載入部分函式 与C 相比 Go並不包括如枚举 异常处理 继承 泛型 此功能在go1 18中加入 断言 虚函数等功能 但增加了切片 Slice 型 并发 管道 垃圾回收 接口等特性的语言级支持 3 對於断言的存在 則持負面態度 同時也為自己不提供型別继承來辯護 不同于Java Go原生提供了关联数组 也称为哈希表 Hashes 或字典 Dictionaries 批評 编辑儘管 Go 的官方與支持者對於語言中不使用泛型與異常處理有著大量辯解說詞 但批評聲也從未停過 在發表 Go 語言 2 0 的草案時 官方稱沒有泛型 異常處理與模組對於 Go 發展造成很大的阻礙 9 等同承認 Go 沒有這些特色是設計錯誤 Go 的垃圾回收機制一直被人詬病 直到 1 8 版本垃圾回收的功能才較為穩定 然而儘管如此 Go 的垃圾回收還是遠遠落後 JVM 的 G1 和 ZGC Discord 的研發團隊在2020年初甚至發表一篇部落格 宣布把其中一個服務由從 Go 轉移至 Rust 理由是 Go 的垃圾回收會導致每2分鐘出現一次卡頓 並且 Discord 研發團隊測試了 Go 語言的1 8 1 9 1 10版本這個問題都沒有改善 10 历史 编辑2007年 Google设计Go 目的在于提高在多核 网络机器 networked machines 大型代码库 codebases 的情况下的开发效率 11 当时在Google 设计师们想要解决其他语言使用中的缺点 但是仍保留他们的优点 12 静态类型和运行时效率 如 C 可读性和易用性 如 Python 和 JavaScript 13 高性能的网络和多进程 设计师们主要受他们之间流传的 不要像C 启发 14 15 16 Go於2009年11月正式宣布推出 17 版本1 0在2012年3月发布 18 19 之后 Go广泛应用于Google的产品 20 以及许多其他组织和开源项目 在2016年11月 Go 一种无衬线体 和Go Mono 字体 一种等宽字体 分别由设计师查爾斯 比格洛 英语 Charles Bigelow 和克莉絲 荷姆斯 英语 Kris Holmes 发布 两种字体均采用了WGL4 英语 WGL4 并且依照着 DIN 1450 标准 可清晰地使用了 large x height 和 letterforms 21 22 在2018年8月 原生的图标更换了 待描述完整 然而 Gopher mascot 仍旧命相同的名字 23 在2018年8月 Go的主要贡献者发布了两个关于语言新功能的 草稿设计 泛型和异常处理 同时寻求Go用户的反馈 24 25 Go 由于在1 x时 缺少对泛型编程的支持和冗长的异常处理而备受批评 版本历史 编辑 主要版本 发布日期 语言改动 26 其他改动1 1 0 3 2012 03 28 初始版本1 11 1 11 6 2018 08 24 无 Go 1 11 增加 WebAssembly 的实验入口 Go 1 11 初次支持新概念 modules 是 GOPATH 的代替品 并支持版本和包的分发 Go 1 11 停止支持 Windows XP 和 Windows Vista Go 1 11 3 以及之后会修复 crypto x509 包的 TLS 认证的脆弱性 vulnerability 1 12 1 2019 02 25 无 Opt in 对TLS 1 3支持 增强对 modules 的支持 为在 Go 1 13 称为默认选择做准备 支持 windows arm 提高 macOS amp iOS 向前兼容1 13 1 2019 09 03 Go 已支持更统一和更现代化的 数字字义前缀 number literal 英语 Integer literal prefixes crypto tls 包中对TLS 1 3 的支持 Go 1 14 将会移除 opt out 支持错误包装 Error wrapping 代码示例 编辑Hello World 编辑 下面是用Go写成的Hello World程序 package main import fmt func main fmt Println Hello World HTTP網頁伺服器 编辑 透過Go僅需幾行程式碼就完成HTTP網頁伺服器的實現 package main import io net http func hello w http ResponseWriter r http Request io WriteString w Hello world func main http HandleFunc hello http ListenAndServe 8000 nil Echo命令程序 编辑 下面的例子说明了怎样用Go去实现一个像Unix中的Echo命令程序 27 package main import os flag var omitNewline flag Bool n false don t print final newline const Space Newline n func main flag Parse Scans the arg list and sets up flags var s string for i 0 i lt flag NArg i if i gt 0 s Space s flag Arg i if omitNewline s Newline os Stdout WriteString s 语言特征 编辑撰寫風格 编辑 Go有定義如下的撰寫風格 每行程式結束後不需要撰寫分號 大括號 不能夠換行放置 if判斷式和for迴圈不需要以小括號包覆起來 使用 tab 做排版除了第二點外 換行會產生編譯錯誤 在不符合上述規定時 仍舊可以編譯 但使用了內建gofmt工具後 會自動整理程式碼 使之符合規定的撰寫風格 專案架構 编辑 module 编辑 Go 採用 module 的概念 於 go1 11才開始啟用 28 舊版本請參閱工作區 每個專案都是一個 module 而每個 module 底下會有個 go mod 的檔案 來管理該 module 所引用的外部庫 開發版本 等等 一個 module 的資料夾目錄可能如下 go mod hello hello go outyet main go main test go 測試用的程式 stringutil reverse go reverse test go 測試用的程式 bmp reader go writer go 然後 go mod 的內容可能為 lt code gt module example org go mod sample go 1 11 require github com golang example v0 0 0 20220412213650 2e68773dfca0 golang org x image v0 1 0 lt code gt 工作區 编辑 Go的工作區 英语 Workspace 位於GOPATH 其目录結構如下 29 src pkg bin 三個目录的用途分別為 目录 用途src 引用的外部庫pkg 編譯時 生成的對象文件 英语 Object file bin 編譯後的程式舉例來說 整個專案目录可能會如下 bin hello 生成的執行檔 outyet 生成的執行檔 pkg linux amd64 github com golang example stringutil a 編譯時 生成的對象檔案 src github com golang example git 外部 Git 庫的詮釋資料 hello hello go Git 庫的程式碼 outyet main go Git 庫的程式碼 main test go Git 庫的程式碼 測試用的程式 stringutil reverse go Git 庫的程式碼 reverse test go Git 庫的程式碼 測試用的程式 golang org x image git 外部 Git 庫的詮釋資料 bmp reader go Git 庫的程式碼 writer go Git 庫的程式碼 轻型协程 编辑 Go的主要特色在於易于使用的併行設計 叫做Goroutine 透過Goroutine能夠讓程式以異步的方式執行 而不需要擔心一個函式導致程式中斷 因此Go也非常地適合網路服務 假設有個程式 裡面有兩個函式 func main 假設 loop 是一個會重複執行十次的迴圈函式 迴圈執行完畢才會往下執行 loop 執行另一個迴圈 loop 這個時候透過Go讓其中一個函式同步執行 如此就不需要等待該函式執行完後才能執行下一個函式 func main 透過 go 我們可以把這個函式同步執行 如此一來這個函式就不會阻塞主程式的執行 go loop 執行另一個迴圈 loop Goroutine是類似線程的概念 属于纖程 区别于协程和线程 線程屬於系統層面 通常來說建立一個新的線程會消耗較多的資源且管理不易 而协程的主要作用是提供在一個線程內的併發性 卻不能利用多個处理器線程 而 Goroutine就像輕量級的線程 一個Go程式可以執行超過數萬個 Goroutine 30 並且這些效能都是原生級的 隨時都能夠關閉 結束 且運行在多個處理器執行緒上 一個核心裡面可以有多個Goroutine 透過GOMAXPROCS參數你能夠限制Gorotuine可以佔用幾個系統線程來避免失控 在內建的官方套件中也不時能夠看見Goroutine的應用 像是net http中用來監聽網路服務的函式實際上是建立一個不斷執行迴圈的Goroutine 同时搭配了epoll 等IO多路复用機制维护Goroutine的事件循环 编译器 编辑当前有两个Go编译器分支 分别为官方编译器gc和gccgo 官方编译器在初期使用C写成 后用Go重写从而实现自举 英语 Bootstrapping compilers 31 Gccgo是一个使用标准GCC作为后端的Go编译器 32 官方编译器支持跨平台编译 但不支持CGO 允许将原始码编译为可在目标系统 架构上执行的二进制文件 參考文獻 编辑 1 0 1 1 go1 20 released 2023 02 01 2023年2月1日 2023年2月1日 Golang google cn 上线 Google黑板报 新浪博客 2020 09 14 原始内容存档于2021 08 14 3 0 3 1 3 2 3 3 Language Design FAQ 2009 11 12 原始内容存档于2013 01 02 Google go language 2018 05 07 原始内容存档于2020 11 28 goyacc go Derived from Inferno s utils iyacc yacc c 2009 11 20 原始内容存档于2010 08 02 Installing Go 2009 11 12 原始内容存档于2012 03 20 存档副本 2018 09 17 原始内容存档于2018 09 17 Go Concurrency Patterns golang org 2020 05 07 原始内容存档于2021 02 05 Go 2 Draft Designs 2021 03 15 原始内容存档于2021 01 26 Why Discord is switching from Go to Rust 2021 03 15 原始内容存档于2022 05 11 Go at Google Language Design in the Service of Software Engineering 2018 10 08 原始内容存档于2021 01 25 Pike Rob Another Go at Language Design Stanford EE Computer Systems Colloquium Stanford University 2010 04 28 2020 01 14 原始内容存档于2014 06 12 Video available 页面存档备份 存于互联网档案馆 Frequently Asked Questions FAQ The Go Programming Language golang org 2016 02 26 原始内容存档于2017 02 25 Andrew Binstock Dr Dobb s Interview with Ken Thompson 2011 05 18 2014 02 07 原始内容存档于2014 03 13 Pike Rob Less is exponentially more 2012 2020 01 14 原始内容存档于2016 03 21 Robert Griesemer The Evolution of Go 2015 2020 01 14 原始内容存档于2017 01 16 Griesemer Robert Pike Rob Thompson Ken Taylor Ian Cox Russ Kim Jini Langley Adam Hey Ho Let s Go Google Open Source Google 2018 05 17 原始内容存档于2021 01 26 Shankland Stephen Google s Go language turns one wins a spot at YouTube The lower level programming language has matured enough to sport the 1 0 version number And it s being used for real work at Google News CNet CBS Interactive Inc March 30 2012 2017 08 06 原始内容存档于2020 11 25 Google has released version 1 of its Go programming language an ambitious attempt to improve upon giants of the lower level programming world such as C and C Release History 2014 12 11 原始内容存档于2017 02 17 Go FAQ Is Google using Go internally 2013 03 09 原始内容存档于2017 02 25 Go fonts The Go Blog Go 2016 11 16 2019 03 12 原始内容存档于2019 07 31 Go Font TTFs GitHub Google 2019 04 02 原始内容存档于2019 07 31 Go s New Brand The Go Blog blog golang org 2018 11 09 原始内容存档于2020 11 25 Go 2 Draft Designs 2018 09 12 原始内容存档于2021 01 26 The Go Blog Go 2 Draft Designs 2018 08 28 2020 01 14 原始内容存档于2021 01 31 Release History The Go Programming Language golang org 2018 08 24 原始内容存档于2017 02 17 存档副本 2009 11 20 原始内容存档于2013 07 08 Go 1 11 Release Notes The Go Programming Language 2022 11 18 原始内容存档于2023 01 03 How to Write Go Code The Go Programming Language 2017 11 15 原始内容存档于2019 02 13 英语 Max number of goroutines stackoverflow com 2017 03 20 原始内容存档于2020 11 25 Google公布实现Go 1 5自举的计划 2015 06 09 原始内容存档于2018 08 07 Go FAQ Implementation 2009 11 12 原始内容存档于2013 01 02 外部連結 编辑官方网站 Golang FAQ 页面存档备份 存于互联网档案馆 Golang Release History and Support 页面存档备份 存于互联网档案馆 YouTube上的The Go Programming Language IRC go nuts IRC irc freenode net 邮件列表Archive is的存檔 存档日期2019 03 14 取自 https zh wikipedia org w index php title Go amp oldid 75605786, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。