這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
起源及演化
最近十年來,C/C++在計算領域沒有很好得到發展,並沒有新的系統程式設計語言出現。對開發程度和系統效率在很多情況下不能兼得。要麼執行效率高,但低效的開發和編譯,如C++;要麼執行低效,但擁有有效編譯,如.NET、Java;所以需要一種擁有較高效的執行速度、編譯速度和開發速度的程式設計語言,Go就橫空出世了。
go是一個Google公司推出的一個開源項目(系統開發語言),它是基於編譯、垃圾收集和並發的程式設計語言。並將其開源並在BSD許可證下發行。
Go最初的設計由Robert Griesemer,Rob Pike 和Ken Thompson在2007年9月開始的,官方的發布是在2009年11月。2010年5月由Rob Pike公開的將其運用於google內部的一個後台系統。目前在google App Engine也支援go語言(目前僅支援三種:Java、Python和Go)
Go可以運行在Linux, Mac OS X, FreeBSD, OpenBSD, Plan 9 和 Microsof windows系統上,同時也支援多種處理器架構:I386, AMD64和ARM
(註:官方網站:
http://golang.org)
Robert Griesemer:曾協助製作Java的HotSpot編譯器和Chrome瀏覽器的JavaScript引擎V8Rob Pike:曾是貝爾實驗室的Unix團隊和Plan9作業系統計劃成員,與Thompson工同創造了UTF-8字元編碼Ken Thompson:是C語言和Unix的創造者。(1983年圖靈獎和1988國家技術獎)他們對系統程式設計語言、作業系統和並發有很深的理解。
主要特點
- Go被設計為21世紀的C語言,它屬於C語言家族,比如:C/C++、Java和C#,同時它吸收了很多現在程式設計語言的優點。
- 對Go的並發機制是源於CSP(Communication Sequential Processes),這同樣的機制也被於Erlang。
- 對C、C++相比,其文法得到了很大程式上的簡化,使代碼更簡明、清楚,同時擁有動態語言的一些特點
- 基於BSD完全開源,所以能免費的被任何人用於適合商業目的。
- 語言層面對並發的支援(goroutine:獨立於OS的線程,所以多個goroutine可以運行在一個OS的線程裡,也可以分布到多個OS線程裡。goroutine是從OS線程上抽象出來的一個輕量級的基於CSP的協程)
- 在語言層面加入對並發的支援,而不是以庫的形式提供
- 更高層次的並發抽象,而不是直接暴露OS的並發機制.
- 多個goroutine間是並行的。
- 底層混合使用非阻塞IO和線程
- 主要目的
- 融合效率、速度和安全的強型別的靜態編譯語言,同時能夠容易的進行編程,讓編程變得更有樂趣。
- 較少的關鍵字和簡潔的文法
- 型別安全和記憶體安全:在指標類型,但不允許對指標進行操作。
- 支援網路通訊、並發控制、並行計算和分散式運算。
- 在語言層面實現對多處理器(或多核)進行編程
- 內嵌運行時反射機制。
- 可以整合C語言實現的庫
- 它不是傳統意義上的物件導向語言(沒有類的概念),但它有介面(interface),由此實現多態特性。
- 函數(Function)是它的基本構成單元(也可以叫著面向函數的程式設計語言)
- 是一種靜態類型和安全的語言,將其編譯、串連成本地代碼(擁有高效的執行效率)
- 支援交叉編譯,並採用編譯的編碼:UTF-8
應用領域
它最初的構想是作為一個系統程式設計語言,但目前也被用於像Web Server,儲存架構等這類分布式、高並發系統中。當然也可以用於一般的文文書處理和作為指令碼程式。
Go的編譯器作為Native Client被內嵌到Chrome瀏覽器中,可以被Web應用程式用來執行本地代碼;同時Go也可以運行在Intel和ARM的處理器上。
目前已被Google整合到Google APP Engine中,在基於Google App Engine基礎設施的Web應用中也得到了很好的應用。目前GAE中僅支援三種應用程式開發語言:Java、Python和Go。(註:GAE的連結)
但不適合應用到對即時性要求很高的系統中,因為Go的記憶體模型是基於記憶體回收機制和原子記憶體配置。
目前缺少的一些特性
目前Go對OO中涉及到的一些特點還沒有很好的支援,但可能會在以後進一步完善。
- 沒有函數和操作符的重載
- 不支援隱式類型轉換, 避免產生Bug和迷惑。
- 不支援類和繼承。
- 不支援動態代碼載入
- 不支援動態庫
- 不支援泛型
總結
Go語言的主要特點
- 強調簡單、易學
- 記憶體管理和文法簡單
- 快速編譯
- 並發支援
- 靜態類型
- 部署簡單(go install)
- 自身就是文檔(通過godoc將代碼中的注釋資訊構造成文檔)
- 開源免費(BSD licensed)