Go
body.skin-minerva .mw-parser-output table.infobox caption{text-align:center}
| 编程范型 | 編譯型,可平行化,結構化,指令式 |
|---|---|
| 設計者 | (罗伯特·格瑞史莫) 羅勃·派克(Rob Pike) 肯·汤普逊(Ken Thompson) |
| 實作者 | |
| 发行时间 | 2009年11月10日(2009-11-10) |
| 穩定版本 | 1.11.4 ( 2018年12月14日(2018-12-14)[1] ) |
| 作業系統 | Linux、Mac OS X、FreeBSD、Windows |
| 許可證 | BSD |
| 網站 | https://golang.org/ |
| 主要實作產品 | |
gc (8g,6g,5g),gccgo | |
| 啟發語言 | |
C、Oberon、Limbo、Newsqueak[2] | |
Go(又稱Golang[3])是Google開發的一种静态强类型、編譯型、并发型,并具有垃圾回收功能的编程语言。
羅伯特·格瑞史莫,羅勃·派克(Rob Pike)及肯·汤普逊於2007年9月开始设计Go,[2],稍後Ian Lance Taylor、Russ Cox加入專案。Go是基於Inferno作業系統所開發的。[4]Go於2009年11月正式宣布推出,成為開放原始碼專案,并在Linux及Mac OS X平台上进行了實現,后来追加了Windows系统下的实现。[5]
在2016年,Go被軟體評價公司TIOBE 選為「TIOBE 2016 年最佳語言」。[6]
目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。
目录
1 描述
2 撰寫風格
2.1 專案架構
3 特色
4 编译器
5 範例
6 同名爭議
7 參考文獻
8 外部連結
描述
Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以東尼·霍爾的交談循序程式(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,[2],但它也具有Pi运算的特征,比如通道传输。在1.8版本中開放插件(Plugin)的支持,這意味著現在能從Go中動態載入部分函式。
与C++相比,Go並不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持[2]。Go 2.0版本將支持泛型[7],對於断言的存在,則持負面態度,同時也為自己不提供型別繼承來辯護。
不同于Java,Go内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。
撰寫風格
在Go中有幾項規定,而且這些是強制的,當不符合以下規定時編譯將會產生錯誤。
- 每行程式結束後不需要撰寫分號(;)。
- 大括號({)不能夠換行放置。
- if判斷式和for迴圈不需要以小括號包覆起來。
Go亦有內建gofmt工具,能夠自動整理程式碼多餘的空白、變數名稱對齊、並將對齊空格轉換成Tab。
專案架構
Go的工作區的目录結構如下[8]:
src
pkg
bin
三個目录的用途分別為
| 目录 | 用途 |
|---|---|
| src | 引用的外部庫 |
| pkg | 編譯時,生成的對象文件 |
| 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並不是線程)。線程屬於系統層面,通常來說建立一個新的線程會消耗較多的資源且管理不易。而 Goroutine就像輕量級的線程,但我們稱其為併發,一個Go程式可以執行超過數萬個 Goroutine[9],並且這些效能都是原生級的,隨時都能夠關閉、結束。一個核心裡面可以有多個Goroutine,透過GOMAXPROCS參數你能夠限制Gorotuine可以佔用幾個系統線程來避免失控。
在內建的官方套件中也不時能夠看見Goroutine的應用,像是net/http中用來監聽網路服務的函式實際上是建立一個不斷執行迴圈的Goroutine。
编译器
当前有两个Go编译器分支,分别为官方编译器gc和gccgo。官方编译器在初期使用C写成,后用Go重写从而实现自举[10]。Gccgo是一个使用标准GCC作为后端的Go编译器[11]。
官方编译器支持跨平台编译(但不支持CGO),允许将原始码编译为可在目标系统、架构上执行的二进制文件。
範例
下面是用Go写成的Hello World程序。
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}
透過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)
}
下面的例子说明了怎样用Go去实现一个像Unix中的Echo命令程序[12]:
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的名稱與2003年發表的程式語言Go!雷同。
參考文獻
^ Release History. [2018-12-14].
^ 2.02.12.22.3 Language Design FAQ
^ Google-go-language
^ goyacc.go: Derived from Inferno's utils/iyacc/yacc.c
^ Installing Go
^ https://www.bnext.com.tw/article/42761/tiobe-2016-program-language
^ https://github.com/golang/go/issues/15292
^ How to Write Go Code. The Go Programming Language (英语).
^ Max number of goroutines. stackoverflow.com. [2017-03-20].
^ Google公布实现Go 1.5自举的计划
^ Go FAQ: Implementation
^ http://golang.org/doc/go_tutorial.html
外部連結
官方网站 ![]()
- Golang FAQ
YouTube上的The Go Programming Language
- IRC:#go-nuts 連線(irc.freenode.net)
- 邮件列表
- 学习Go
- Go Web 编程
- Go程式設計導論
- Go语言高级编程
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||

Comments
Post a Comment