Go语言学习重点
? ? 近年來多核化和集群化正在成為了互聯網時代發展的典型特征,Go語言的設計者們宣稱對C、C++、java、C#、Delphi,乃至于PHP、Python、Perl、Ruby等語言感到深深的沮喪,他們要創造一門新的編程語言來滿足分布式和并行計算的要求,事實也證明現在國內許多互聯網公司在編寫大并發高效處理的服務業務首選Go作為開發語言。對于C、C++、java和C#開發工程師來說,學習Go會非常輕松,特別是抓住下面的知識點,上手是分分鐘的事情。
- 并發編程模型分為兩個流派:共享內存流派和消息傳遞流派,gotoutine和channel構成go語言的基礎,雖然go語言支持共享內存,但還是忘記它吧,只有channel才能把gotoutine的性能發揮到極致;
- go語言是強制統一代碼風格的編程語言,首字母大寫的變量、函數和方法等同于公有屬性為包外可見,否則為對象私有包外不可見,變量函數命名規則主流有駱駝命名法(JAVA和C#)和下劃線法(C),強烈建議駱駝法,左花括號必須位于行尾否則編譯不給過,如果不能改變就不要吐槽go的編碼風格;
- go語言支持函數多返回值,如:f, err := os.Open(filename),不關心可以使用占位符表示,如:f, _ := os.Open(filename),免去傳遞一大堆引用參數或封裝結構體和對象的尷尬,越用越喜歡的語言特性;
- defer關鍵字含義為無論函數執行是否異常,均在函數退出前自動執行,且執行的順序為先進后出,用法例如:創建連接defer連接、打開句柄defer句柄、打開結果集defer結果集;
- go語言反對函數和操作符重載、反對繼承、虛函數,但并不代表go語言不能實現上述功能,可以通過組合方式變現,go語言同時放棄了對象的構造和析構等OOP特性,接口(interface)的非侵入性是其與其他面向對象語言最大的區別,go語言在面向對象的編程思想上真正做到了取C++、JAVA精髓而又去其糟粕;
- go數據分為數值語義和引用語義,其中數組是數值語義,切片和字典(二者與channel一樣均為引用語義)作為內置的數據類型,支持接口、閉包和匿名函數、支持反射、支持自動垃圾回收,充分體現了go語言的先進性;
- go語言定義一個接口并聲明一個接口變量,new一個對象賦值給接口變量從而實現接口與類型的直接轉換,松散低耦合的對應關系大大降低接口調整導致的代碼變動量,優勢誰用誰知道;
- Cgo功能提供C與go語言的交互,相比JNI簡單易用多了,幾行注釋輕輕松松實現集成和調用真是省心省力;
- 采用gdb對go程序調試與C沒有特別的不同,調試信息的格式為DWARFv3,gdb的版本需高于7.1,C\C++開發工程師表示毫無壓力;
- go語言的位運算符取反操作為^x,與其他語言~x的寫法不同,時時刻刻提醒go就是go,是顏色不一樣的煙火,天空海闊,要做最堅強的泡沫~
- go語言switch的case可以是值也可以是表達式如:0 <= num && num <= 3,也可以如case 1, 2, 3多個值,且語句下不用接break,關鍵字fallthrough表示執行完當前case后繼續執行下面的case,C\C++和java表示無可奈何;
- go語言循環語句關鍵字為for,支持foreach風格(for idx, arg := range args),但不支持while和do-while,類似while(1)和while(true)之類的代碼不會再出現了;
- 函數func myfunc(args ...int)表示入參個數不確定,原樣傳參:myfunc1(args...),傳片段:myfunc2(args[1:]...),表示把args片段從下標1到結尾打散傳輸,不確定類型的如:func myfunc3(args ...interface{});
- 匿名函數:func(ch chan int) {ch <- ACK} (reply_chan),形參ch是一個int類型的channel,大括號是函數體,reply_chan為實參表示實際調用,f := func(x, y int) int {return x + y}表示將匿名函數賦值給函數對象變量f,開始別扭習慣就好了;
- go語言函數是函數,方法是方法,函數是一段代碼片段,方法是指定了函數的接收者;方法:func (a *Integer) Add(b Integer)指出其接收者為Integer對象的指針類型,func (a Integer) Add(b Integer)為對象的值類型,區別在于對接收者a的操作結果,此外,go語言編譯器可以根據值語義的接收者方法自動生成引用語義的接收者方法,沒讀懂請再讀一遍;
- go語言支持接口查詢功能,例如:if file, ok := file1.(two.IStream); ok {...},其中file1為某接口變量,two.IStream為某包下的某接口定義,判斷ok值后調用接口中的方法可以避免不必要的異常;
- go語言采用select判斷句柄狀態,每個case必須是一個IO操作,超時控制首先異步sleep指定時間,然后向超時chan里寫入值,在select下的case里可讀出意味超時,go語言沒有提供直接的超時處理機制,這種變通的實現方法總覺得設計者高深莫測有所保留;
- 單向channel機制,例如:var ch1 chan<- float64,表示ch1是單向channel,只用于寫入float64數據,再例如:var ch2 <-chan int,表示ch2是單向channel,只用于讀取int數據,channel之間可以相互轉換,把chan單向強制類型轉換成雙向go不禁止但這么做要對得起自己的良心;
- sync.Once(函數名)用于全局初始化操作,sync.atomic子包提供一系列原子操作的函數,各種語言分別有對應的方法,列出來加深記憶;
- type Person struct {
???????? ????Name string "name"
???????????? Mail string "mail"
????????}為每個字段增加tag以便通過反射機制獲取成員變量,以及用于標注序列化字段的名稱;
- 一份賞心悅目的代碼可以提高工作效率,如果不知道怎么空格怎么縮進怎么換行可以執行命令go fmt 源文件.go,學習一下以后就這樣寫代碼吧;
????開發工具強烈建議JetBrains,風格一如IDEA,Go語言汲取了眾多語言的優點,但更簡單更精煉,值得花些時間研究,因為它老爸叫谷歌。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: java基础---动态代理机制
- 下一篇: 聊聊rocketmq的BrokerHou