這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Golang 基礎文法 (1)
變數的聲明
在 go 的包中,一個變數或者方法函數或者常量以大寫字母開頭,可以被包外看見使用
既大寫的包變數或者包方法或者包常量是可以匯出的
小寫包變數和包方法還有包常量只能在包內訪問
//定義一個變數,名稱為 "numberOfTimes",類型為 "int"var numberOfTimes int//定義三個變數,類型為 “int"var var1, var2, var3 int//定義一個變數,名稱為 "numberOfTimes",類型為 "int",值為 "3"var numberOfTimes int = 3//定義三個類型為 "int" 的變數,並且初始化它們的值var var1, var2, var3 int = 1, 2, 3
package main//var foo string//foo := "test"func main(){ var bar int foo1 := 10 //v1 v2 v3可以是任意類型,編譯器會自動確認資料類型 vname1, vname2, vname3 := v1, v2, v3 //下面的 var1 := 11會報錯,因為變數 var1已經被定義,不能重複定義 var var1 int = 10 var1 := 11 //下面正確,只是給 var2重新賦值 var var2 int = 10 var2 = 12}
go 語言中沒有使用的包或者變數,會導致編譯失敗
//"net/http" 包匯入不使用,如果包裡面有 init 方法,只執行 init 方法import( "fmt" _ "net/http")func main(){ //函數 divede 傳回值第一個放棄不使用 _, remainder := divide(10, 3)}
//匯入包import( "fmt" "os")//常量定義const( i = 100 pi = 3.1415 prefix = "Go_")//變數var( i int pi float32 prefx string)//結構體type( people struct{ name string age int } animal struct{ name string leg int })
const( x = iota // x == 0 y = iota // y == 1 z = iota // z == 2 w // 省略 iota ,w == 3)const( a = iota // a == 0 b = 10 c // c == 1 d // d == 2)const v = iota //v ==0const( e, f, g = iota, iota, iota // e==0, f==0, g==0 因為在同一行)
基礎資料型別 (Elementary Data Type)的特性
錯誤類型Error types
go 沒有異常處理機制,內建 error 類型,用於處理 errors
go 要求我們要麼顯式處理錯誤要麼忽略
array, slice, map
var arr [n]typea := [3]int{1, 2, 3}//... 自動識別數組長度a := [...]int{1,3,3}d := [2][2]int{[2]int{0,0}, [2]int{2,2}}d1 := [2][2]int{{1,1}, {22,22}}
var fslice []intslice := []byte{'a', 'c', 'd'}
a := []int{1,2,3,5}b := a[1:] // b 為 2,3,5 但是 a b 共用底層資料結構,修改 a 或者 b , a和 b 都會改變b := a[:2] // b 為 1, 2
slice 的索引只能是 int,map 的索引可以是任何你想要的類型
numbers := make(map[string]int)numbers["one"] = 1
make new 區別
控制結構和函數
if test {}//分號隔開,賦值if x := len(slice); x >0 {}
func my(){ i := 0Here: //label goto i++ goto Here //跳轉到 Here}
for 可替代 while,do-while
switch
case 的值可以有多個 逗號隔開
只執行匹配的 case 不需要 break
default 如果沒有匹配的執行
func 定義函數
函數有0-多個參數,參數名稱在參數類型前
函數可以返回多個值或者不傳回值
多變參數 ...
go 函數參數本質都是傳值
函數可以被當做值和參數類型
func funcName(p1 type1, p2 type2)(returnType1, returnType2{ return a, b}func varFunc(arg1 ...int){}
defer 順延強制,先進後出 FILO
panic & recover
main & init 函數
import 匯入包
. 操作符,調用的還是可以忽略掉包名
別名
_ 只匯入不使用
import( . ”fmt" //忽略包名 o "os" //別名 _ "net/http" //匯入包執行 init 方法不使用)
未完待續