這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
快速瞭解 http://go-tour-zh.appspot.com/welcome/1 (可以需要爬牆)
下面記錄下瞭解go的過程,特別記錄下與你腦子裡原有“觀念”不同的地方:
1. 聲名 初始化,類型在後面,不一樣
var a, b int var a,b =1,2
var c, python, java = true, false, "no!"a,b:=func fname(string,string) //非聲明,必須在func使用
短聲明變數
在函數中,`:=` 簡潔指派陳述式在明確類型的地方,可以用於替代 var
定義。
函數外的每個文法塊都必須以關鍵字開始(`var`、`func`、等等),`:=` 結構不能使用在函數外。
2.函數返回多個值
func swap(x, y string) (string, string) { //x, y string 等價 x sring ,y string
return y, x
}
命名傳回值
func swap(string, string) (x, y string) { #傳回值分別命名為x,y
x= x+12
y= y+1
return
} // 空return實際返回的是x,y
3.對於聲明了但沒使用的變數,引入但沒有使用的包,會引發錯誤, go可以自動格式化源碼
func 函數體的第一個'{'必須在同一行(?試了不在一行格式不行,運行出錯)
4.包
每個 Go 程式都是由包組成的。
程式啟動並執行入口是包 `main`。
package mainimport ("fmt""math/rand")func main() {fmt.Println("My favorite number is", rand.Intn(10)) //先不管rand.Intn幹什麼的,按照慣例,包名與匯入路徑的最後一個目錄一致。例如,`"math/rand"` 包由 package rand
語句開始}
注意:匯出名
在匯入了一個包之後,就可以用其匯出的名稱來調用它。
在 Go 中,首字母大寫的名稱是被匯出的。(算是一種慣例/約定,如python裡_function _varname是私人一樣)
package mainimport ("fmt""math")func main() {fmt.Println(math.pi)}
Foo
和 FOO
都是被匯出的名稱。名稱 foo
是不會被匯出的 ,所以math.pi肯定不存在,可能Pi是存在的
5.基本類型
Go 的基本類型有Basic types
boolstringint int8 int16 int32 int64uint uint8 uint16 uint32 uint64 uintptrbyte // uint8 的別名rune // int32 的別名// 代表一個Unicode碼float32 float64complex64 complex128
package mainimport ("fmt""math/cmplx")var ( //這樣用很特別ToBe bool = falseMaxInt uint64 = 1<<64 - 1z complex128 = cmplx.Sqrt(-5 + 12i))func main() {const f = "%T(%v)\n"fmt.Printf(f, ToBe, ToBe) //bool(false)
fmt.Printf(f, MaxInt, MaxInt) //uint64(18446744073709551615)
fmt.Printf(f, z, z) //complex128((2+3i)) 不懂
}
6.類型轉換 不同類型間轉換需要顯式進行,即使從int往int64轉也得顯式 (c是可以隱式轉換的,溢出不提示)
7.迴圈只有for ,沒有 while ,通過省略for的首尾式可以做到while一樣的事 :for i < 10 {}