Go語言語法匯總快速參考
Go語言的語法總結了一下,做個快速參考
數據類型
-
</li>var varName type
,var var1,var2… type
,var varName type = Value
,var varName1,varName2 type = Value1,Value2
,var varName1,varName2=Value1,Value2
,varName1,varName2:=Value1,Value2
,定義數據類型。 -
聲明了沒有被使用的變量將在編譯時報錯。
</li> -
常量定義:
</li>const varName = Value
,const varName type = Value
-
</li>string
字符串類型值不可改變,但是可以切片,字符串可以使用+
進行連接 -
</li>iota
用來聲明enum
,表示自加1,初始為0 -
</li>var arrayName [N]type
用來聲明數組,或者使用arrayName := [N]type{ v1,v2…}
來聲明 -
數組聲明可以嵌套
</li> -
</li>slice
用來表示切片,聲明方式var sliceName []type
或者sliceName := []type{v1,v2…}
-
</li>slice
保存的是引用而非實體 -
在
</li>slice
中有一些內置函數,len
獲取長度,cap
獲取最大容量,append
追加數據,copy
用來拷貝數據 -
</li>map
聲明方式為var mapName map[keyType] valueType
或者mapName := make(map[keyType]valueType)
-
</li>map
可通過key : value
初始化 -
</li> </ul>make
用于內建類型的內存分配,new
用于各種類型的內存分配,new
返回指針而make
返回非0的值流程控制
-
if
語句不需要括號,在if語句中可以聲明變量,用分好分割if
語句的條件判斷
</li>if x:=function();x<10 { fmt.Printf("x < 10,%d\n",x); }else{ fmt.Print("x >= 10 ,%d\n",x); }
-
</li>goto
語句類似C語言,但是跳轉到必須在當前函數內定義的標簽 -
</li>for
語句類似C語言,但是break
和continue
可以跟標號,跳出多重循環。 -
</li> </ul>switch
語句不用break
,如果想強行執行下面的case可以使用fallthrough
函數
聲明方式:
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2)
-
</li>func
用來聲明函數,函數名為funcName
,后面跟輸入,輸出的數據類型。 -
函數可以有多個返回值
</li> -
函數的值操作和指針操作類似C語言,內置類型中的
</li>string
,slice
,map
直接使用的是類似的指針傳遞,不用使用取地址符,但是,如果需要改變slice
的長度,則需要取地址穿指針。 -
</li>defer
語句用來表示在函數返回前執行的語句。 -
</li>type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])
用來聲明一個函數類型,主要用于高階函數中。 -
</li> </ul>import
用來導入包,package
用來導出包,包操作使用.
操作符Struct類型
-
聲明方式:
</li>type Person struct { name string age int }
-
匿名方式,匿名方式下A含有B的所有類型
</li>type Student struct { Person // 默認Person的所有字段 speciality string }
-
如果匿名類型中有字段和本身有沖突,可以使用匿名類型+
</li>.
訪問 -
類型的方法聲明:
</li>func (r ReceiverType) funcName(parameters) (results)
-
可以使用:
</li>type typeName typeLiteral
來自定義類型,定義完以后可以使用方法來擴展類型的功能。 -
需要改變struct內部的值時,需要將
</li>ReceiverType
定義為*
指針類型,但是調用的時候不需要,go語言自動幫你完成了。 -
方法可以繼承,可以重載
</li> </ul>interface接口
-
</li>type InterfaceName interface
用來定義inerface
-
interface類型定義了一組方法,如果某個對象實現了某個接口的所有方法,則此對象就實現了此接口。
</li> -
空interface(interface{})不包含任何的method,正因為如此,所有的類型都實現了空interface
</li> -
一個函數把interface{}作為參數,那么他可以接受任意類型的值作為參數,如果一個函數返回interface{},那么也就可以返回任意類型的值
</li> -
</li>value, ok = element.(T)
,這里value
就是變量的值,ok
是一個bool
類型,element
是interface
變量,T是斷言的類型,如果ok
為true
則表示,element
確實是T
類型的。 -
</li> </ul>interface
可以嵌套并發
-
使用
</li>go
關鍵字+函數名
實現并發 -
使用
</li>channel
實現線程間通訊,channel
通過make
構造,使用<-
來發送和接受數據。 -
chan
是channel
的關鍵字,后面跟數據類型ch <- v
發送數據,v:=<-ch
接收數據,ch
是chan
類型。package main import "fmt" func sum(a []int, c chan int) { total := 0 for _, v := range a { total += v } c <- total // send total to c }
func main() { a := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(a[:len(a)/2], c) go sum(a[len(a)/2:], c) x, y := <-c, <-c // receive from c fmt.Println(x, y, x + y) }</code></pre></li>
</li>channel
默認是阻塞形式的,可以進行線程同步。
</li>ch := make(chan type, value)
構造channel時可通過設置不同的value
來設定channl的buffer長度。
</li>close
用來關閉channel
使用
</li>select
+case
來選擇多個channel使用
</li>select
+case <- time.After(5 * time.Second)
來設定超時
</li>Goexit
退出當前執行的goroutine,但是defer函數還會繼續調用
</li>Gosched
讓出當前goroutine的執行權限,調度器安排其他等待的任務運行,并在下次某個時候從該位置恢復執行。
</li>NumCPU
返回 CPU 核數量
</li>NumGoroutine
返回正在執?行和排隊的任務總數
</li> </ul> 來自:http://blog.csdn.net/ygrx/article/details/11732055GOMAXPROCS
用來設置可以運行的CPU核數
-
-
-
-
-