Go語言文法匯總

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。



最近看了看GoLang,把Go語言的文法總結了一下,做個快速參考


資料類型

  • var varName typevar var1,var2… typevar varName type = Valuevar varName1,varName2 type = Value1,Value2var varName1,varName2=Value1,Value2varName1,varName2:=Value1,Value2,定義資料類型。

  • 聲明了沒有被使用的變數將在編譯時間報錯。

  • 常量定義: const varName = Value , const varName type = Value

  • string字串類型值不可改變,但是可以切片,字串可以使用+進行串連

  • iota用來聲明enum,表示自加1,初始為0

  • var arrayName [N]type用來聲明數組,或者使用 arrayName := [N]type{ v1,v2…}來聲明

  • 數組聲明可以嵌套

  • slice用來表示切片,聲明方式var sliceName []type或者sliceName := []type{v1,v2…}

  • slice儲存的是引用而非實體

  • slice中有一些內建函數,len擷取長度,cap擷取最大容量,append追加資料,copy用來拷貝資料

  • map聲明方式為var mapName map[keyType] valueType或者mapName := make(map[keyType]valueType)

  • map可通過 key : value 初始化

  • make用於內建類型的記憶體配置,new用於各種類型的記憶體配置,new返回指標而make返回非0的值

流程式控制制

  • if語句不需要括弧,在if語句中可以聲明變數,用分好分割if語句的條件判斷

      if x:=function();x<10 {      fmt.Printf("x < 10,%d\n",x);  }else{      fmt.Print("x >= 10 ,%d\n",x);  }
  • goto語句類似C語言,但是跳轉到必須在當前函數內定義的標籤

  • for語句類似C語言,但是breakcontinue可以跟標號,跳出多重迴圈。

  • switch語句不用break,如果想強行執行下面的case可以使用fallthrough

函數

聲明方式:

func funcName(input1 type1, input2 type2) (output1 type1, output2 type2)
  • func用來聲明函數,函數名為funcName,後面跟輸入,輸出的資料類型。

  • 函數可以有多個傳回值

  • 函數的值操作和指標操作類似C語言,內建類型中的string,slice,map直接使用的是類似的指標傳遞,不用使用取地址符,但是,如果需要改變slice的長度,則需要取地址穿指標。

  • defer語句用來表示在函數返回前執行的語句。

  • type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])用來聲明一個函數類型,主要用於高階函數中。

  • import用來匯入包,package用來匯出包,包操作使用.操作符

Struct類型

  • 聲明方式:

      type Person struct {  name string  age int  }
  • 匿名方式,匿名方式下A含有B的所有類型

      type Student struct {  Person  // 預設Person的所有欄位  speciality string  }
  • 如果匿名型別中有欄位和本身有衝突,可以使用匿名型別+.訪問

  • 類型的方法聲明:

      func (r ReceiverType) funcName(parameters) (results)
  • 可以使用:type typeName typeLiteral來自訂類型,定義完以後可以使用方法來擴充類型的功能。

  • 需要改變struct內部的值時,需要將ReceiverType定義為*指標類型,但是調用的時候不需要,go語言自動幫你完成了。

  • 方法可以繼承,可以重載

interface介面

  • type InterfaceName interface用來定義inerface

  • interface類型定義了一組方法,如果某個對象實現了某個介面的所有方法,則此對象就實現了此介面。

  • 空interface(interface{})不包含任何的method,正因為如此,所有的類型都實現了空interface

  • 一個函數把interface{}作為參數,那麼他可以接受任意類型的值作為參數,如果一個函數返回interface{},那麼也就可以返回任意類型的值

  • value, ok = element.(T),這裡value就是變數的值,ok是一個bool類型,elementinterface變數,T是斷言的類型,如果oktrue則表示,element確實是T類型的。

  • interface可以嵌套

並發

  • 使用go關鍵字+函數名實現並發

  • 使用channel實現線程間通訊,channel通過make構造,使用<-來發送和接受資料。

  • chanchannel的關鍵字,後面跟資料類型ch <- v發送資料,v:=<-ch接收資料,chchan類型。

      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)  }
  • channel預設是阻塞形式的,可以進行線程同步。

  • ch := make(chan type, value)構造channel時可通過設定不同的value來設定channl的buffer長度。

  • close用來關閉channel

  • 使用select+case來選擇多個channel

  • 使用select + case <- time.After(5 * time.Second)來設定逾時

  • Goexit 退出當前執行的goroutine,但是defer函數還會繼續調用

  • Gosched 讓出當前goroutine的執行許可權,調度器安排其他等待的任務運行,並在下次某個時候從該位置恢複執行。

  • NumCPU 返回 CPU 核心數量

  • NumGoroutine 返回正在執⾏行和排隊的任務總數

  • GOMAXPROCS 用來設定可以啟動並執行CPU核心數


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.