golang基礎-防忘指北

    一    坑java

        1.    用自帶的 json 庫序列化 strut 變量時,只有那些首字母大寫的變量纔會被序列化,這意味着在go的世界裏,全部的json屬性名都是大寫開頭...這真的不是bug嗎...(ps : 已經找到大寫轉小寫的解決方案,沒搞清楚就挖坑,捂臉...)linux

        2.    任何一個未被捕獲的 panic 都有可能致使整個程序的崩潰,必定要defer, recover...json

        3.    err != nil 就是翔,interface{} 濫用是翔中翔...設計模式

        4.    基礎屬性間的轉換 和 拼接 也是翔...api

        5.    用go時,先忘記java的 設計模式 和 一切皆對象        數組

        6.    在go裏,變量的nil值須要特別關注,由於會被賦予0值。業務設計上須要避開 或者 利用這一點函數

        7.    window 和 linux 的syscall包的 api 不一致,須要特別關注,想編譯個linux包時才知道什麼叫痛ui

 

 

    二 指北spa

        1.    package <pkgName>這一行表示當前文件屬於哪一個包,而包名main則告訴咱們它是一個可獨立運行的包,它在編譯後會產生可執行文件。除了main包以外,其它的包最後都會生成*.a文件(也就是包文件)並放置在$GOPATH/pkg/$GOOS_$GOARCH中。每個可獨立運行的Go程序,一定包含一個package main,在這個main包中一定包含一個入口函數main,而這個函數既沒有參數,也沒有返回值。設計

        2.    點操做,導入包時,若是包名前有點號,則在調用這個包的函數時,能夠省略前綴的包名。如fmt.println()能夠寫爲println()。

        3.    別名操做,能夠在導入的包前加入字符串指定別名;_操做,當導入的報名前包含該符號時,意爲調用該包裏的init函數,而不直接使用包裏的函數。

        4.    rune是int32的別稱,byte是uint8的別稱,int8和int32這類位數不一樣的變量之間不容許互相賦值或者操做。

        5.    浮點數的類型有float32和float64兩種(沒有float類型),默認是float64。

        6.    ` 括起的字符串爲Raw字符串,即字符串在代碼中的形式就是打印時的形式,它沒有字符轉義,換行也將原樣輸出。

        7.    除非被顯式設置爲其它值或iota,每一個const分組的第一個常量被默認設置爲它的0值,第二及後續的常量被默認設置爲它前面那個常量的值,若是前面那個常量的值是iota,則它也被設置爲iota,iota的默認值爲0,每調用一次都會加1,但每遇到一個const,iota就會重置

        8.    大寫字母開頭的變量是可導出的,也就是其它包能夠讀取的,是公用變量;小寫字母開頭的就是不可導出的,是私有變量。 大寫字母開頭的函數也是同樣,至關於class中的帶public關鍵詞的公有函數;小寫字母開頭的就是有private關鍵詞的私有函數。

        9.    Slice,go裏面的動態數組,它是一個引用類型。聲明一個slice和申明一個array同樣,只是少了長度定義:var myslice []int

        10.    Slice能夠從一個已經存在的數組或者slice中再次聲明,經過array[i:j] 來獲取,由於slice是引用類型,改變其值也會改變原數組的值。

        11.    Map有兩個返回值,第一返回值爲請求的key的value,第二個返回值爲該key是否存在,是的話true,反之false;map也是引用類型,值的修改會影響全部一樣引用該map的值

        12.    Make用於內建類型(map,slice 和channel)的內存分配,new用於各類類型的內存分配

        13.    For配合range能夠用於讀取slice和map中的內容。

        14.    Switch的每一個case後面默認帶有break,能夠經過fallthrough強制執行後面的代碼,每個fallthrough只會生效一次。

        15.    在函數體中,變參是一個slice數組。

        16.    函數的參數傳遞是值傳遞,若是須要在函數體中調整參數本體信息,須要定義指針類型參數,並傳入地址。

        17.    Defer語句會在函數體執行完後開始執行,執行順序是後進先出,也就是逆序。

        18.    當函數做爲一種變量時,能夠經過type來進行定義,他的類型就是全部擁有相同的參數,相同的返回值的一種類型。

        19.    panic有點像java中的拋出異常,當函數調用了panic後,該協程的會執行函數體中的defer,而後一路向上返回,直到協程退出。

        20.    正常時調用recover會返回nil,沒有任何其餘效果,可是當協程陷入崩潰狀態(相似panic),則recover會捕獲到panic的值,而且讓協程恢復正常執行,有點相似java中的catch。

        21.    Struct有 N 種初始化方式,一種按參數順序提供值 p:=person(‘xxx’, 123);第二種時經過field:value的方式初始化,如:p:={name:’xx’,age:12}

        22.    當匿名字段是一個stuct時,該struct的所有字段都被隱式的導入當前的struct。

        23.    對象的方法須要以函數的形式進行綁定,默認是值傳遞,當以指針綁定時,是引用傳遞,相似: func (b *box) test() string{}

        24.    Go裏,接口是方法的聚合,當某個對象實現了某個接口的全部方法時,則認爲此對象實現了該接口,能夠將對象的值賦給該接口類型,能夠經過接口訪問對象的方法,但不能訪問對象的屬性。

        25.    空接口作參數時,能夠接受任何類型的參數,由於至關於任意類型都實現了該接口。

        26.    Value, ok = element.(T) 能夠用於判斷 element是不是T類型的數據,value是變量的值,element是interface類型的變量;element.(type)不能在switch外的地方使用。

        27.    能夠經過close(c)方法來關閉一個channel;能夠經過range來不斷的讀取channel中的數據,直到該channel被顯示的關閉;能夠經過select來監視channel的讀寫。

        28.    交換 i 和 j 變量的方式 : i, j = j, i 。

相關文章
相關標籤/搜索