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核數
-
-
-
-
-