Go,为了方便浏览器和识别,部分人称其为Golang,是Google开发的一种静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言。[3]hKS快充网络
罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计 Go 语言,[2],稍后 Ian Lance Taylor, Russ Cox 加入项目中。Go 语言是基于Inferno 操作系统所开发的。[4]Go 语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux 及 Mac OS X 平台上进行了实现,后追加 Windows 系统下的实现。[5]hKS快充网络
目前 Go 语言基于 1.x 每半年发布一个版本。hKS快充网络
hKS快充网络
hKS快充网络
Go 语言的语法接近 C语言,但是对于变量的声明是不同的。Go语言支持垃圾回收功能。Go 语言的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,[2],但它也具有Pi运算的特征,比如通道传输。在 1.8 版本中开放 Plugin(插件)的支持,这意味着现在能从 Go 语言中动态加载部分函数。hKS快充网络
与 C++ 相比,Go 语言并不包括如异常处理、继承、泛型、断言、虚函数等功能,但增加了 Slice 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持[2]。Google 目前仍正在讨论是否应该支持泛型,其态度还是很开放的,但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。hKS快充网络
不同于 Java,Go语言内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。hKS快充网络
撰写风格[编辑]
在 Go 语言中有几项规定,而且这些是强制的,当不匹配以下规定时编译将会产生错误。hKS快充网络
- 每行程序结束后不需要撰写分号(;)。
- 花括号({)不能够换行放置。
- IF 判断式和 For 循环不需要以小括号包覆起来。
Go 语言亦有内置 gofmt 工具,能够自动整理代码多余的空白、变量名称对齐、并将对齐空白转换成 Tab。hKS快充网络
Go 语言的主要的功能在于令人简易使用的并行设计,这个方法叫做 Goroutine,通过 Goroutine 能够让你的程序以异步的方式运行,而不需要害怕一个函数导致程序阻塞,因此 Go 语言也非常地适合网络服务。让我们假设有个程序,里面有两个函数:hKS快充网络
func main() {
// 假設 loop 是一個會重複執行十次的迴圈函式。
// 迴圈執行完畢才會往下執行。
loop()
// 執行另一個迴圈。
loop()
}
在这个时候我们可以通过 go 来让其中一个函数以并发的方式运行,如此一来就不需要等待该函数运行完后才能运行下一个函数。hKS快充网络
func main() {
// 透過 `go`,我們可以把這個函式以並行執行,
// 如此一來這個函式就不會主阻塞程式的執行。
go loop()
// 執行另一個迴圈。
loop()
}
Goroutine 是类似线程的概念(但 Goroutine 并不是线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易。而 Goroutine 就像轻量级的线程,但我们称其为并发,一个 Go 程序可以运行超过数万个 Goroutine[6],并且这些性能都是原生级的,随时都能够关闭、结束。一个核心里面可以有多个 Goroutine,通过 GOMAXPROCS 参数你能够限制 Gorotuine 可以占用几个系统线程来避免失控。hKS快充网络
在内置的官方包中也不时能够看见 Goroutine 的应用,像是 net/http 中用来监听网络服务的函数实际上是创建一个不断运行循环的 Goroutine。hKS快充网络
编译器[编辑]
当前有两个 Go 语言的编译器的分支。官方编译器gc和gccgo。官方编译器在初期使用C写成,后用go重写从而实现自举[7]。Gccgo是一个使用标准GCC作为后端的Go编译器[8]。hKS快充网络
官方编译器支持跨平台编译(但不支持CGO),允许将源码编译为可在目标系统、架构上执行的二进制文件。hKS快充网络
下面是用 Go 语言写成的 Hello World 程序。hKS快充网络
1 package main
2
3 import "fmt"
4
5 func main() {
6 fmt.Println("Hello, World")
7 }
通过 Go 语言仅需几行程序码就完成 HTTP 网页服务器的实现:hKS快充网络
1 package main
2
3 import (
4 "io"
5 "net/http"
6 )
7
8 func hello(w http.ResponseWriter, r *http.Request) {
9 io.WriteString(w, "Hello world!")
10 }
11
12 func main() {
13 http.HandleFunc("/", hello)
14 http.ListenAndServe(":8000", nil)
15 }
下面的例子说明了怎样用 Go 语言去实现一个像 Unix 中的 Echo命令程序[9]:hKS快充网络
1 package main
2
3 import (
4 "os"
5 "flag"
6 )
7
8 var omitNewline = flag.Bool("n", false, "don't print final newline")
9
10 const (
11 Space = " "
12 Newline = "\n"
13 )
14
15 func main() {
16 flag.Parse() // Scans the arg list and sets up flags
17 var s string = ""
18 for i := 0; i < flag.NArg(); i++ {
19 if i > 0 {
20 s += Space
21 }
22 s += flag.Arg(i)
23 }
24 if !*omitNewline {
25 s += Newline
26 }
27 os.Stdout.WriteString(s)
28 }
同名争议[编辑]
2003年发表的编程语言 Go!,Go 名称与其雷同。hKS快充网络