為什么你要學(xué)Go語言
- C語言比,復(fù)雜性低了很多。作者中有C語言的發(fā)明者。
- 與Python比,Go保持了接近C語言的性能, 它原生支持高并發(fā)
- 使用廣泛,2020年3月TIOBE編程語言排行榜,Go已經(jīng)沖進(jìn)了前十了。著名的docker就是用Go寫的
我為什么要學(xué)Go?
作為一個(gè)軟件架構(gòu)師,我不允許自己知識(shí)上有盲點(diǎn)。
環(huán)境準(zhǔn)備
安裝Go編譯器
- 上官網(wǎng) https://golang.google.cn/dl/ 在Featured downloads里根據(jù)你的操作系統(tǒng)下載最新版本。
- 雙擊打開,下一步下一步完成安裝即可。
安裝IDE
不管什么編程語言,我只用我的最愛支持幾乎所有語言的 VSCode(https://code.visualstudio.com/) ,沒安裝,點(diǎn)擊我下載安裝。
寫個(gè)HelloWorld
打開VSCode,新建個(gè)文件:
package main
import "fmt"
func main() {
fmt.Printf("hello, Go\n")
}
保存為hello.go 。這時(shí)候智能的VSCode會(huì)提示你安裝Go的插件,點(diǎn)擊install安裝即可。
編譯運(yùn)行
直接運(yùn)行
不需要編譯就可以直接運(yùn)行的,調(diào)試非常方便。 在cmd里,進(jìn)入到hello.go所在的目錄
root@testmode:~# go run hello.go
hello, Go
編譯成exe,再運(yùn)行
這種適合你要發(fā)布你的代碼的場(chǎng)景。 同樣,在cmd里,進(jìn)入到hello.go所在的目錄。
root@testnode:~# go build hello.go
root@testnode:~# ls
hello hello.go
root@testnode:~# ./hello
hello, Go
root@testnode:~#
編譯為so,對(duì)外發(fā)布
不需要編譯就可以直接運(yùn)行的,在cmd里,進(jìn)入到hello.go所在的目錄
root@testnode:~# go build -buildmode=c-shared -o hello.so hello.go
root@testnode:~# ls
hello hello.go hello.so
root@testnode:~#
看,是不是多了個(gè)hello.so。這種編譯到so的編譯模式需要依賴gcc,windows下安裝比較麻煩,所以,我是在Ubuntu下玩的。有人可能想,為什么要編譯為so呢,因?yàn)槭俏襭ython愛好者。我學(xué)Go,就是想通過Go來解決Python性能不足的問題。對(duì)于python項(xiàng)目中對(duì)性能要求特別高的模塊,可以用go語言編寫,再使用python的ctypes調(diào)用(第二天嘗試沒成功)。Oh,Shit。 No Perfect!
問題
第二天更新,今天一直在嘗試使用python的ctypes來調(diào)用go 編譯出來的動(dòng)態(tài)鏈接庫,但是很遺憾失敗了。 我轉(zhuǎn)眼又想,這個(gè)是必須的嗎? 在微服務(wù)的時(shí)代里,我們還必須這樣嗎?
答案是"確實(shí)不必要"。因?yàn)樵趃o里寫一個(gè)http接口也是如此的簡(jiǎn)單。
來個(gè)實(shí)例吧。
package main
import (
"fmt"
"net/http"
)
func index(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Hello, world.\n")
}
func main() {
http.HandleFunc("/", index)
http.ListenAndServe("127.0.0.1:5000", nil)
}
因此,我不再糾結(jié)ctypes了,不要古代的強(qiáng)綁定。換個(gè)思路,選擇微服務(wù),像不像現(xiàn)代婚姻。