跳至內容

Go

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

這是本頁的一個歷史版本,由140.114.66.110對話2013年10月23日 (三) 12:02編輯。這可能和目前版本存在着巨大的差異。

Go
編程範型編譯型, 可平行化結構化指令式
設計者羅伯特·格瑞史莫Robert Griesemer英語Robert Griesemer
羅勃·派克Rob Pike
肯·湯普遜Ken Thompson
實作者Google
釋出時間2009
目前版本
  • 1.23.3(2024年11月6日)[1]
編輯維基數據連結
作業系統Linux, Mac OS X, FreeBSD
許可證BSD
網站http://golang.org/
主要實作產品
gc (8g, 6g,5g), gccgo
啟發語言
COberonLimboNewsqueak[2]

GoGoogle開發的一種編譯型可平行化,並具有垃圾回收功能程式語言[3]

羅伯特·格瑞史莫Robert Griesemer英語Robert Griesemer),羅勃·派克(Rob Pike)及肯·湯普遜於2007年9月開始設計Go語言,[2],稍後Ian Lance Taylor, Russ Cox加入專案中。Go語言是基於Inferno操作系統所開發的。[4]Go語言於2009年11月正式宣佈推出,成為開放原始碼專案,並在LinuxMac OS X平台上進行了實現,後追加Windows系統下的實現。[5]

描述

Go語言的語法接近C語言,但是對於變數的聲明是不同的,其他語法不同之處是For迴圈if判斷式沒有括弧圍繞。Go語言支援垃圾回收功能。Go語言的併行模型是以東尼·霍爾CSP為基礎,採取類似模型的其他語言包括occamLimbo[2],但它也具有Pi運算的特徵,比如通道傳輸。

與C++相比,Go語言並不包括如例外處理繼承泛型斷言虛擬函式等功能,但增加了slice型、並行、管道、垃圾回收、介面(interface)等特性的語言級支援[2]。當然,Google 對於泛型的態度還是很開放的,但在該語言的常見問題列表中,對於斷言的存在,則持負面態度,同時也為自己不提供型別繼承來辯護。不同於Java,Go語言內嵌了關聯陣列(也稱為雜湊表(hashes)或字典(dictionaries)),就像字串類型一樣。

實現

當前有兩個Go語言的編譯器的分支。gccgo和6g/8g/5g,其中6g/8g/5g分別代表64位元、32位元及Arm架構編譯器。下面看編譯的代碼:6g編譯器使用:

 $ 6g helloworld.go  # 把原始码编译到 helloworld.6 这个 object file
 $ 6l helloworld.6   # 把所需的 object files 給連結起來,輸出可執行檔到 6.out
 $ ./6.out
 Hello, world; or 你好世界
 $

gccgo 編譯器使用:

 $ gccgo helloworld.go
 $ ./a.out
 Hello, world; or 你好世界
 $

6g(X86-64)、8g(X86)、5g(arm) (及其支援工具,總稱為gc)用C寫成,使用yacc/Bison作為解析器。Gccgo是一個使用標準GCC作為後端的Go編譯器[6]

範例

下面是用Go語言寫成的Hello World程式。

package main

import "fmt"

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

下面的例子說明了怎樣用Go語言去實現一個像Unix中的 echo命令的程式[7]

package main

import (
	"os"
	"flag" // command line option parser
)

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)
}

同名爭議

2003年發表的程式語言Go!,名稱與Go雷同。

參考文獻

外部連結