最近兩天對go語言做了一個初步的了解,記錄一下,之前沒有按照原創發表,所以重新發布一次,
第一個感受就是使用起來方便,從官網下載安裝包,參考https://golang.google.cn/doc/install,解壓到/usr/local/go目錄,然后將go目錄下的bin目錄添加到環境變數即可export PATH=$PATH:/usr/local/go/bin,最后運行go version查看是否生效,撰寫一個簡單的go檔案,直接go run hello.go即可運行起來了,
如果要使用vscode進行除錯也非常方便,安裝go相關的插件即可(ctrl+shift+p,輸入go:install),注意開國內代理go env -w GOPROXY=https://goproxy.cn,然后在main函式的那個檔案按F5就可以除錯了,可以打斷點看堆疊變數的值,我是用的wsl2配的centos7,體驗很不錯,
學習過c/c++后,對go的學習就更加容易了,很多基本都是c相關的語法,增加了一些新特性,比如gc,goroutine協程,channel通道,對于高并發編程更加方便,一個協程類似于用戶態輕量級現場,采用go加函式名的方式運行,在一個協程里面可以通過channel的方式將值傳到另外的協程,channel類似于管道的概念,這樣多個協程直接就可以通信了,
go語言編程時對格式有要求,比如左花括號不能換行,vscode保存時會自動格式化代碼,看起來還是很清爽的,
注意go沒有繼承的概念,但可以實作面向物件的多型,主要是通過interface的方式,只要某個struct實作了該interface里面的所有方法,就可以將該struct看作該interface的具體實作,類似于java里面的implement,只是省略了該關鍵詞,對該方法就可以實作多型呼叫,即定義變數用interface型別,實體化為某個struct型別,該變數呼叫interface的方法其實就是呼叫interface的實作的方法了,這里的interface其實類似于c++里面的抽象類,抽象類里面只給方法,不給具體實作,由繼承的子類來完成實作,一個struct可以實作多個interface的介面,相當于多重實作了,
但go可以通過組合的方式實作偽繼承,直接在struct里面寫上需要基礎的struct的名字,這個struct的變數和成員就繼承下來了,寫多個struct的名字,就相當于c++里面的多重繼承了,如果子類和父類有相同的成員,呼叫時優先選擇子類的,如果子類沒有,而多個父類有相同的成員,那呼叫時就需要指定是哪一個父類,否則就報錯了,
至于封裝特性,可以將package下面go檔案里面的struct名字以小寫字母開頭,這樣就是私有的了,struct里面的成員也以小寫字母開頭,如果要public屬性,就已大寫字母開頭,然后寫一個new的方法,該方法以大寫字母開頭,這樣就是公有的了,類似于c++里面的建構式,如果要訪問或者改寫struct里面的私有成員 就可以寫一個以大寫字母開頭的set/get函式,這樣就可以在包外呼叫了,這里是權限訪問主要是通過大小寫開頭來控制的,省略了public和private的關鍵詞,
go采用package的方式進行工程管理,包名一般為檔案夾的名字,檔案夾下面有很多go源檔案,一個包名類似于cpp里面的namespace,如在一個go檔案中要使用另外一個包里面的成員,就需要在檔案頭加入import,比如import “fmt”,這個fmt就是標準庫的一部分,目前go的標準庫比較豐富,很多功能直接接入標準庫即可完成,類似于python,減少了很多造重復輪子的代碼量,
另外一個要說的是,c++和java都有例外處理的機制,拋出例外后catch,go也有這樣的機制,只是名字不一樣,go通過panic拋出error資訊,通過recovery()捕獲錯誤,一般將recovery放在defer中,一個函式中可以有多個defer,是以堆疊的方式存盤,函式退出時反向呼叫defer,相當于出堆疊,所以可以在defer里面捕獲錯誤,這個defer有點類似java里面的finally,go對有回傳error的函式必須處理其錯誤,除非該函式的回傳值也不考慮,就可以不處理error,
本文作者: nephen
本文鏈接: https://www.nephen.cn/posts/570203e5/
著作權宣告: 本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 3.0 許可協議,轉載請注明出處!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458340.html
標籤:Go
