Go語言語法匯總快速參考

jopen 11年前發布 | 17K 次閱讀 Go語言 Google Go/Golang開發

Go語言的語法總結了一下,做個快速參考

 

數據類型


  • var varName typevar var1,var2… typevar varName type = Valuevar varName1,varName2 type = Value1,Value2var varName1,varName2=Value1,Value2varName1,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>

  • make用于內建類型的內存分配,new用于各種類型的內存分配,new返回指針而make返回非0的值

    </li> </ul>

    流程控制


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

        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語言,但是breakcontinue可以跟標號,跳出多重循環。

      </li>

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

      </li> </ul>

      函數


      聲明方式:

      func funcName(input1 type1, input2 type2) (output1 type1, output2 type2)

      • func用來聲明函數,函數名為funcName,后面跟輸入,輸出的數據類型。

        </li>

      • 函數可以有多個返回值

        </li>

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

        </li>

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

        </li>

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

        </li>

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

        </li> </ul>

        Struct類型


        • 聲明方式:

            type Person struct {
            name string
            age int
            }
          </li>

        • 匿名方式,匿名方式下A含有B的所有類型

            type Student struct {
            Person  // 默認Person的所有字段
            speciality string
            }
          </li>

        • 如果匿名類型中有字段和本身有沖突,可以使用匿名類型+.訪問

          </li>

        • 類型的方法聲明:

            func (r ReceiverType) funcName(parameters) (results)
          </li>

        • 可以使用:type typeName typeLiteral來自定義類型,定義完以后可以使用方法來擴展類型的功能。

          </li>

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

          </li>

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

          </li> </ul>

          interface接口


          • type InterfaceName interface用來定義inerface

            </li>

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

            </li>

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

            </li>

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

            </li>

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

            </li>

          • interface可以嵌套

            </li> </ul>

            并發


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

              </li>

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

              </li>

            • 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) }</code></pre></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>

            • GOMAXPROCS 用來設置可以運行的CPU核數

              </li> </ul> 來自:http://blog.csdn.net/ygrx/article/details/11732055

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!