含著金鑰匙出生的go
近幾年,各程式設計語言中,最火的莫過於Go了。
Go誕生於Google, 是由以下三位電腦領域的大師寫的
Go的親爹們
由於出身名門,Go在誕生之初就吸引了大批開發人員的關注。誕生十年以來,已經有很多基於Go的應用,一直有傳言Go在將來是要取代現在Java的位置。對於一門只有十年歷史的新語言,Go的發展勢頭是相當迅猛的。
國外的docker就是用Go寫的,國內的七牛團隊廣泛使用Go。而今如火如荼的區塊鏈技術更是將Go推上了熱潮
聽起來這麼牛逼的技術,少年,你不想學下嗎?
go環境搭建
在官網下載go的安裝包
如果是mac,可直接用brew安裝:
brew intall go
查看go版本
go [master] go versiongo version go1.10.2 darwin/amd64
關於編輯器,推薦使用jetbrains出品的golang
第一個go程式
按照官網的demo,運行第一個go程式
建立hello.go檔案
package mainimport "fmt"func main() { fmt.Println("Hello, 世界")}
運行go可以有兩種方式:
- 類似於python,php這樣的指令碼語言,直接運行,一步到位
demo [master] go run hello.go Hello, 世界
- 如java,c++ 一樣,要進行編譯,再運行編譯輸出的可執行檔
demo [master] go build hello.go # 產生可執行檔 hello demo [master] lshello hello.go demo [master] ./hello # 運行可執行檔 Hello, 世界
代碼解析
go是一門有著文法潔癖的語言,如強制規定了大括弧的寫法。長期以來,關於大括弧是否要另起一行,是程式員界的聖戰,且這個聖戰跨越了語言,作業系統,編輯器。戰鬥雙方多年來廝殺無數回合,不分勝負。python之父Guido van Rossum直接取消了大括弧,完全採用縮排,繞過了聖戰。與之相比,go就顯得很霸道了,直接下了死命令:
"大括弧只能在當前行開始,不能另起一行,另起一行是異教徒,直接編譯出錯!"
讓我們來試下:
大括弧報錯
對於另起一行的強迫症程式員,想用go,惟有屈服。
此外,如果程式中有冗餘變數,或引入了沒有用到的包,都會報錯
package mainimport "fmt" // 引入了fmt包,但沒有使用func main() {}
報錯:
demo [master] go build hello.go# command-line-arguments./hello.go:3:8: imported and not used: "fmt"
變數聲明後不用
對於從其他語言轉過來的程式員,一開始會不習慣go的霸道規定,尤其是我大PHP程式員。PHP的規範是出了名的鬆散,隨便寫都行,程式員在寫代碼時是挺爽的,怎麼開心怎麼來,但是要維護別人的代碼就感到很噁心了。
go的設計理念既簡潔又嚴謹,用強制性的規則保證了代碼的一致性。
變數
go在定義變數的規範上,有些反人類。c++, java 都是在變數名之前聲明資料類型,而go卻別出心裁的將資料類型聲明置於變數名後面。
命名規則
變數的命名規則:以字母或底線開頭,對大小寫敏感。不能使用go的保留關鍵字
go保留關鍵字
範圍
- 在代碼塊聲明的變數,只在塊內有效
變數範圍
- 在函數內部聲明的變數,只在函數內有效
函數內部變數
- 在函數外部聲明的變數,在整個包內都有效。如果變數名稱是大寫的,即在整個程式中都有效
包內全域變數
如果變數名要共用到其他包,就需要將包名改成大寫
建立以下目錄結構:
demo [master] tree -L 2.├── main│ └── main.go└── test └── test.go
main.go
package mainimport ( "fmt" "../test" // 引入test包)func main() { fmt.Println(test.NAME) // 擷取test包的NAME變數}
test.go
package testvar NAME = "章魚喵" // 變數名大寫,才能被其他包引用,類似於java中的public關鍵字
結果:
demo [master] go run main/main.go章魚喵
你可以試下將test中的NAME改為name,go會報錯,小寫變數是模組的私人變數,其他模組無法引用
常量
常量使用const
關鍵字表示,常量一旦定義了,就不可再更改。因此常量只適用於布爾型、數字型(整數型、浮點型和複數)和字串型。
package mainimport "fmt"const name = "章魚喵"const say = "喜歡我的文章,點個贊吧,或者賞杯咖啡錢"const year = 2018func main() { fmt.Println(name) fmt.Println(say) fmt.Println(year)}
這種寫法顯得很囉嗦,可以用更簡潔的方式:
package mainimport "fmt"const ( name = "章魚喵" say = "喜歡我的文章,點個贊吧,或者賞杯咖啡錢" year = 2018)func main() { fmt.Println(name) fmt.Println(say) fmt.Println(year)}
demo [master] go run main/main.go章魚喵喜歡我的文章,點個贊吧,或者賞杯咖啡錢2018
資料類型
go的資料類型從大類劃分為:布爾型,數字類型,字串類型,衍生類別型
各個類型的具體說明,請自行查閱Go 語言資料類型
go是強型別語言,每個變數都要指定類型,如果不指定,go在編譯時間會自動根據變數的值推導變數的資料類型。
變數的類型不能更改,廣大PHP開發人員要謹記了,PHP是弱類型語言,同一個變數,可以隨時切換儲存的資料類型。PHP的變數不好比是一個萬能的筐,什麼都可以裝。而go的變數是專器專用
package mainimport "fmt"func main() { var name string = "章魚喵" // 指定了資料類型為string var say = "智慧如你,有什麼要說的,要評論區發表吧..." // 可省略資料類型 //say = 2018 // 編譯報錯:不能篡改類型 fmt.Println(name) fmt.Println(say)}
demo [master] go run main/main.go章魚喵智慧如你,有什麼要說的,要評論區發表吧...
實值型別與參考型別
實值型別:變數儲存的是資料本身,如基礎資料型別 (Elementary Data Type):字串,布爾型,數字等
參考型別:變數儲存的是資料所在的記憶體位址,如:指標,map, chan等
package mainimport "fmt"func main() { var content = "跟章魚喵一起學go吧..." // 實值型別 var pipe = make(chan int, 1) // 參考型別 fmt.Println(content) // 儲存具體資料 fmt.Println(pipe) // 儲存記憶體位址}
demo [master] go run main/main.go跟章魚喵一起學go吧...0xc42005a070
小結
筆記總結
如果覺得本文對你有所協助,點個贊,或者賞杯咖啡錢,你的認可對我很重要