更多文章
更多精彩文章
描述
Go语言的语法接近C语言,但对于 变量的声明 ( 英语 : type declaration ) 有所不同。Go语言支持垃圾回收功能。Go语言的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo, ,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go语言中动态加载部分函数。
与C++相比,Go语言并不包括如异常处理、继承、泛型、断言、虚函数等功能,但增加了 Slice 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持 。Google 目前仍正在讨论是否应该支持泛型,其态度还是很开放的,但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
不同于Java,Go语言内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。
撰写风格
在Go语言中有几项规定,而且这些是强制的,当不匹配以下规定时编译将会产生错误。
每行程序结束后不需要撰写分号(;)。
大括号({)不能够换行放置。
IF 判断式和 For 循环不需要以小括号包覆起来。
Go 语言亦有内置 gofmt 工具,能够自动整理代码多余的空白、变量名称对齐、并将对齐空白转换成 Tab。
特色
Go语言的主要的功能在于令人简易使用的并行设计,这个方法叫做Goroutine,通过Goroutine能够让你的程序以异步的方式运行,而不需要担心一个函数导致程序中断,因此Go语言也非常地适合网络服务。假设有个程序,里面有两个函数:
funcmain(){// 假設 loop 是一個會重複執行十次的迴圈函式。// 迴圈執行完畢才會往下執行。loop()// 執行另一個迴圈。loop()}
这个时候我们通过go让其中一个函数同步运行,如此就不需要等待该函数运行完后才能运行下一个函数。
funcmain(){// 透過 `go`,我們可以把這個函式同步執行,// 如此一來這個函式就不會主阻塞程式的執行。goloop()// 執行另一個迴圈。loop()}
Goroutine是类似线程的概念(但Goroutine并不是线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易。而 Goroutine就像轻量级的线程,但我们称其为并发,一个Go程序可以运行超过数万个 Goroutine ,并且这些性能都是原生级的,随时都能够关闭、结束。一个核心里面可以有多个Goroutine,通过GOMAXPROCS参数你能够限制Gorotuine可以占用几个系统线程来避免失控。
在内置的官方包中也不时能够看见Goroutine的应用,像是net/http中用来监听网络服务的函数实际上是创建一个不断运行循环的Goroutine。
编译器
当前有两个Go语言的编译器的分支。官方编译器gc和gccgo。官方编译器在初期使用C写成,后用go重写从而实现自举 。Gccgo是一个使用标准GCC作为后端的Go编译器 。
官方编译器支持跨平台编译(但不支持CGO),允许将源码编译为可在目标系统、架构上执行的二进制文件。
示例
下面是用Go语言写成的Hello World程序。
1 packagemain2 3 import"fmt"4 5 funcmain(){6 fmt.Println("Hello, World")7 }
通过 Go 语言仅需几行程序码就完成 HTTP 网页服务器的实现:
1 packagemain 2 3 import( 4 "io" 5 "net/http" 6 ) 7 8 funchello(whttp.ResponseWriter,r*http.Request){ 9 io.WriteString(w,"Hello world!")10 }11 12 funcmain(){13 http.HandleFunc("/",hello)14 http.ListenAndServe(":8000",nil)15 }
下面的例子说明了怎样用 Go 语言去实现一个像Unix中的Echo命令程序 :
1 packagemain 2 3 import( 4 "os" 5 "flag" 6 ) 7 8 varomitNewline=flag.Bool("n",false,"don"t print final newline") 9 10 const(11 Space=" "12 Newline="\n"13 )14 15 funcmain(){16 flag.Parse()// Scans the arg list and sets up flags17 varsstring=""18 fori:=0;i0{20 s+=Space21 }22 s+=flag.Arg(i)23 }24 if!*omitNewline{25 s+=Newline26 }27 os.Stdout.WriteString(s)28 }
同名争议
2003年发表的编程语言 Go! ( 英语 : Go!_(programming_language) ) ,Go 名称与其雷同。
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
{{item.time}} {{item.replyListShow ? '收起' : '展开'}}评论 {{curReplyId == item.id ? '取消回复' : '回复'}}