Golang note

一、 單點知識:

1. &取址,*取值

2. 包訪問:“大小寫控制”

     大寫:可導出[要使某個符號對其他包可見,只需將該符號定義爲以大寫字母開頭即可。這規則對於成員變量和成員函數是一致的。]

     小寫:私有

3. var + import

           pkg.fuc

var name type = value

var (
    name1 type1 = value1
    name2 type2 = value2
    name3 type3 = value3
    ...
)

    import(

              "fmt"

               "os"

)

4. := “局部” 

   := 是聲明變量並賦值

   :=只能在函數中使用,所以只能定義局部變量。

   :=定義的變量不能改變值(也就是b:="q",在函數中不能再重新這樣定義 b:="s",但是可以b="s")

   b, f := "q", 1

   

    =  “全局”

    = 是賦值,var和=可以平行定義並賦值:

5.字符串兩種表示: 

    “     ”           

    '       '

6. make 引用 (高效)   map sclice channel   

   new 值

7. Fuc 函數 可以賦值給變量:   var identifier = fuc()

    IF 接口  y,ok =x.(Type) 轉換成 Type類型的IF;默認爲 pointer類型;

8.case,switch:

  1、花括號{必須與for處於同一行。

  2、單個case後可以出現多個結果選項

  3、只有在case中明確添加fallthrough關鍵字,纔會繼續執行下一個case

-------------------------------------------------------------------------------

二、 非單點知識點:

1、func 函數名(args ...Type) (返回值列表) {
    // 函數體
}

        形如args ...Type的用法只能作爲函數的參數類型,並且必須是最後一個參數

        形如args ...Type的用法是一個語法糖(syntactic sugar),即對語言功能沒有影響,但可以增加程序的可讀性。

        形如args ...Type的用法從內部實現上說,其本質上是一個數組切片,即[]type,因此可以用for循環來獲得每個傳入的參數。

 

2、流程控制語句類型

       ▪ 選擇語句中,左花括號{必須與switch同處一行。

       ▪ 選擇語句中,case後可以使用常量,還可以使用變量。

       ▪ 選擇語句中,單個case後可以出現多個結果選項。

       ▪ 選擇語句中,不需要用break來明確退出一個case

       ▪ 選擇語句中,只有在case中明確添加fallthrough關鍵字,纔會繼續執行下一個case

 

       ▪ 選擇語句中,可不設定switch後的條件表達式,在此種情況下整個switch結構與if...else...的邏輯等同。

 

 

 循環語句只支持for結構,不支持whiledo-while結構。

       ▪ 循環語句左花括號{必須與for處於同一行。

       ▪ 循環語句不支持以逗號爲間隔的多賦值語句,支持使用多元賦值的方式來初始化多個變量。

       ▪ 循環語句支持continuebreak來控制循環,但提供了一個更高級的break,可以選擇中斷哪一層循環。

 

       ▪ 條件語句不需要使用括號()將條件包含起來。

       ▪ 條件語句無論語句體內有幾條語句,花括號{}都必須存在。

       ▪ 條件語句的左花括號{必須與ifelse同處一行,否則編譯器給出錯誤:syntax error: missing { after if clause。

       ▪ 條件語句的else必須和上一個語句體結束的右花括號}同處一行,否則編譯器給出錯誤:syntax error: unexpected else, expecting }。

       ▪ 條件語句在if之後可以添加變量初始化語句,但需要使用分號;間隔。

if a := 1; a >= 1 {
    fmt.Println("OK")
}

       ▪ 條件語句:關鍵字爲if、else和else if。

       ▪ 選擇語句:關鍵字爲switch、case和select。

       ▪ 循環語句:關鍵字爲for和range。

       ▪ 跳轉語句:關鍵字爲goto

 

3、資源釋放


       在c++程序中,經常要注意內存指針、文件句柄、網絡套接字等等資源的釋放,特別需要注意其釋放的時機。而golang使用defer
關鍵字和背後的內部機制簡單地解決了資源釋放的問題。

        defer關鍵字能保證其後的代碼能在函數退出前調用。

        一個函數中可以存在多個defer語句,需要注意的是defer語句的調用是遵照先進後出的原則,即最後一個defer語句將最先被執行

        可以在defer後加一個匿名函數來進行復雜的清理工作。

異常處理


       一些高級語言中一般提供類似try...catch...finally...的語法,用於捕獲異常。golang提供panicrecover兩個關鍵字用於異常處理。

• panic

       panic在golang中是一個內置函數,接收一個interface{}類型的值作爲參數:

func panic(interface{}) {
    ...
}

       當一個函數執行過程中調用panic函數時,函數執行流程將立即終止,但panic之前的defer關鍵字延遲執行的語句將正常執行,之後該函數將返回到上層調用函數,並逐層向上執行panic流程,直至函數所屬的goroutine中所有正在執行函數終止。錯誤信息將被報告,包括在調用panic()函數時傳入的參數。

• recover

       recover在golang中是一個內置函數,返回一個interface{}類型的值作爲參數:

func recover() interface{} {
    ...
}

       panic函數觸發後不會立即返回,而是先defer,再返回。如果defer的時候,有辦法將panic捕獲到,然後及時進行異常處理,並阻止panic傳遞,那處理機制就完善了。因此golang提供了recover內置函數,用於捕獲panic並阻止其向上傳遞。需要注意的是,recover之後,邏輯並不會恢復到panic處,函數還是會在defer之後返回,但是所屬goroutine將不會退出。

4、• 值類型和引用類型

        引用類型一個特點:引用不綁定特定對象(c++中引用是要綁定特定對象),例如有兩個同類型引用a和b,它們可以引用各自的對象A和B;但如果a和b的引用都指向A,那麼通過b修改對象內容可以反應到a引用之中。

       √ golang從本質上說,一切皆是值類型,並沒有內建一個類似java或c#等語言中的reference類型。 

        golang可以使用指針,可以在行爲上達到類似java或c#等語言中reference的效果。

        golang中從行爲表現上看,數組屬於值類型數組切片、字典、通道和接口屬於引用類型

▶  引用類型實現

        golang中通過指針能實現引用類型效果

        golang中通過指針或對象訪問成員都是使用點操作符,因此指針看起來和對象一樣,即類似引用

 

5、與數組切片和字典類似,通道和接口本質上說值類型,但從行爲表現上看屬於引用類型

6、

 

 

golang 類型:

基礎+複合


        golang內建基礎類型有布爾類型、整數類型、浮點類型、複數類型、字符串類型、字符類型和錯誤類型。

       

 

  golang支持的複合類型有指針、數組、數組切片、字典、通道、結構體和接口。

       

 

 

 

11. reflect.Value.Kind():返回的常量:

      const (
    Invalid Kind = iota
    Bool
    Int
    Int8
    Int16
    Int32
    Int64
    Uint
    Uint8
    Uint16
    Uint32
    Uint64
    Uintptr
    Float32
    Float64
    Complex64
    Complex128
    Array
    Chan
    Func
    Interface
    Map
    Ptr
    Slice
    String
    Struct
    UnsafePointer
)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章