算是正式開始學習go語言顿痪,早之前工作中幾次接觸到go,只是能大概看懂這塊代碼是實現(xiàn)什么功能和做些局部性的小改動(在借助于查資料的情況下)來滿足業(yè)務需求汞幢,但是沒有花時間去系統(tǒng)的學習下楷拳。一方面是,現(xiàn)在好多不錯的開源實現(xiàn)也是使用go來開發(fā)的方援,可以學習下,比如知名的tidb涛癌,ethereum犯戏,及公司內部的一些開源實現(xiàn)和微服務相關送火,另一方面,好多崗位都招go或者C/C++/go這樣的組合先匪,算當作以后求職的一個技能點种吸。
因為之前一直是C/C++/Lua/Nodejs這些,好像每份工作中使用到的開發(fā)語言都不同呀非,總體感覺Lua/Nodejs雖然使用上方便坚俗,業(yè)務開發(fā)較容易上手,但因為有些錯誤只能在運行時才發(fā)現(xiàn)岸裙,比如變量abl寫成ab1這樣的坦冠,未定義的變量也不會報錯;所以作為服務器開發(fā)來說哥桥,穩(wěn)定和正確是最重要的。
對于Nodejs激涤,使用上真的挺方便的拟糕,很多庫不需要重新造輪子,當時分析socket.io/superagent相關源碼來滿足業(yè)務上的需求倦踢,有些功能雖然被官方實現(xiàn)或者集成到語言中送滞,沒有太多的機會從零設計踩坑,網(wǎng)上還是有很多原理性的分析可以參考辱挥。
這幾天簡單的了解/學習go的基礎語法犁嗅,執(zhí)行流程,后續(xù)會深入學習它的更高特性比如協(xié)程晤碘,閉包褂微,熱更,socket等相關园爷,及開發(fā)過程中的debug宠蚂,性能分析及內存問題排查的使用。目前只是基本學習童社,還是要再深入基礎求厕。
在學習go的過程中,發(fā)現(xiàn)go的大部分特性跟其他語言差不多扰楼,比如變量命名呀癣,作用域,循環(huán)弦赖,表達式等项栏,所表達的意思,雖然語法上不一樣蹬竖。所以我會在學習go的過程中忘嫉,會潛意識中和C/C++對比下異同點荤牍。
不過初次學習和寫一些demo還是有些不習慣,比如go中結構體type person struct庆冕,C/C++中 struct person這樣康吵,函數(shù)的返回值及形參聲明相關;在學習到切片時访递,重點了解其實現(xiàn)原理和擴容機制晦嵌,這里和C++中的vector思想類似,只不過前者擴容時在不同條件下擴容系數(shù)是不同的拷姿。
對于指針惭载,不同的指針類型只是告訴編譯器如何解釋某塊內存空間(即尋址范圍),比如int *响巢,在32位系統(tǒng)中描滔,編譯器讀取這四個字節(jié)解釋;struct *是一個結構體的地址范圍踪古,void *則不知道如何解釋含长,所以需要強轉類型。
至于引用伏穆,對于C++來說拘泞,其底層機制也是通過指針來實現(xiàn)的,而在go中枕扫,我目前還沒學到(先記一下陪腌,后面再補充)。對于int/pointer等內建類型來說烟瞧,傳值和傳引用區(qū)別不大诗鸭;而像結構體這樣的,傳值則會引起(可能的潛)拷貝参滴,且表明會在函數(shù)不會修改只泼,因為是實參的副本,所以這里加不加const其實關系不大卵洗,對于要在函數(shù)中修改實參的请唱,則需要加引用或者指針,這里說的是C++过蹂,可以參考《深度探索C++對象模型》(此書較老十绑,且當時的C++版本應該是早于03)。go中應該不能使用const來修飾函數(shù)形參酷勺。(常量的值必須是能夠在編譯時就能夠確定的本橙,可以在其賦值表達式中涉及計算過程,但是所有用于計算的值必須在編譯期間就能獲得脆诉。)
還有很多后面再補...