含著金鑰匙出生的go
近幾年,各編程語言中,最火的莫過于Go了。
Go誕生于Google, 是由以下三位計算機領域的大師寫的
由于出身名門,Go在誕生之初就吸引了大批開發者的關注。誕生十年以來,已經有很多基于Go的應用,一直有傳言Go在將來是要取代現在Java的位置。對于一門只有十年歷史的新語言,Go的發展勢頭是相當迅猛的。
國外的docker就是用Go寫的,國內的七牛團隊廣泛使用Go。而今如火如荼的區塊鏈技術更是將Go推上了熱潮
聽起來這么牛逼的技術,少年,你不想學下么?
go環境搭建
在官網下載go的安裝包
如果是mac,可直接用brew安裝:
brew intall go
查看go版本
? go [master] ? go version
go version go1.10.2 darwin/amd64
關于編輯器,推薦使用jetbrains出品的golang
第一個go程序
按照官網的demo,運行第一個go程序
新建hello.go文件
package main
import "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] ? ls
hello hello.go
? demo [master] ? ./hello # 運行可執行文件
Hello, 世界
go是一門有著語法潔癖的語言,如強制規定了大括號的寫法。長期以來,關于大括號是否要另起一行,是程序員界的圣戰,且這個圣戰跨越了語言,操作系統,編輯器。戰斗雙方多年來廝殺無數回合,不分勝負。python之父Guido van Rossum直接取消了大括號,完全采用縮進,繞過了圣戰。與之相比,go就顯得很霸道了,直接下了死命令:
"大括號只能在當前行開始,不能另起一行,另起一行是異教徒,直接編譯出錯!"
讓我們來試下:
對于另起一行的強迫癥程序員,想用go,惟有屈服。
此外,如果程序中有冗余變量,或引入了沒有用到的包,都會報錯
package main
import "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的保留關鍵字
作用域
- 在代碼塊聲明的變量,只在塊內有效
- 在函數內部聲明的變量,只在函數內有效
- 在函數外部聲明的變量,在整個包內都有效。如果變量名稱是大寫的,即在整個程序中都有效
如果變量名要共享到其他包,就需要將包名改成大寫
創建以下目錄結構:
? demo [master] ? tree -L 2
.
├── main
│ └── main.go
└── test
└── test.go
main.go
package main
import (
"fmt"
"../test" // 引入test包
)
func main() {
fmt.Println(test.NAME) // 獲取test包的NAME變量
}
test.go
package test
var NAME = "章魚喵" // 變量名大寫,才能被其他包引用,類似于java中的public關鍵字
結果:
? demo [master] ? go run main/main.go
章魚喵
你可以試下將test中的NAME改為name,go會報錯,小寫的變量是模塊的私有變量,其他模塊無法引用
常量
常量使用const
關鍵字表示,常量一旦定義了,就不可再更改。因此常量只適用于布爾型、數字型(整數型、浮點型和復數)和字符串型。
package main
import "fmt"
const name = "章魚喵"
const say = "喜歡我的文章,點個贊吧,或者賞杯咖啡錢"
const year = 2018
func main() {
fmt.Println(name)
fmt.Println(say)
fmt.Println(year)
}
這種寫法顯得很啰嗦,可以用更簡潔的方式:
package main
import "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 main
import "fmt"
func main() {
var name string = "章魚喵" // 指定了數據類型為string
var say = "智慧如你,有什么要說的,要評論區發表吧..." // 可省略數據類型
//say = 2018 // 編譯報錯:不能篡改類型
fmt.Println(name)
fmt.Println(say)
}
? demo [master] ? go run main/main.go
章魚喵
智慧如你,有什么要說的,要評論區發表吧...
值類型與引用類型
值類型:變量存儲的是數據本身,如基本數據類型:字符串,布爾型,數字等
引用類型:變量存儲的是數據所在的內存地址,如:指針,map, chan等
package main
import "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
小結
如果覺得本文對你有所幫助,點個贊,或者賞杯咖啡錢,你的認可對我很重要