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