最近在學習 go 語言,當然編輯器用的還是最熟悉的 vs code 了。
雖然說 vs code 著實很佔內存,但是沒辦法,誰讓他配置起來方便快捷,並且對於前端程序員來說,著實是一大開發利器。
之前也用過 sublime, notepad++ 等輕量級編輯器,但是自從用過了 vs code 以後,就再也用不回去了。著實有種「曾經滄海難為水,除卻巫山不是雲」的感覺。
寫前端代碼寫習慣了,裝個插件也是方便的狠,直接搜一下,然後點擊安裝,裝好以後重啟一下編輯器就能愉快的使用了。
但是這套經驗對於我這個 go 的新手來說,卻不是那麼的適用了。
打開插件擴展,搜與 go 有關的插件,排在第一個的就是微軟官方出品的 go 插件。
當時一想,我就樂了,既然編輯器用的都是人家開源的產品,那麼人家定製的 go 插件也沒有理由不用了吧。
這一用不要緊,卻讓我後面折騰了好久,才搞明白,原來人家這插件是給你裝上了個全家桶啊。
我天真的以為,裝了這個插件以後,直接就能用了,哪曾想到,我 shift + alt + F 格式化代碼的時候,就會蹦出下面類似的提醒:
於是我就只能點個 Install All 了,卻沒想到每次 go 這個插件總是不斷地提示安裝失敗了,大概就是輸出下面這樣的提示信息:
Installing github.com/derekparker/delve/cmd/dlv FAILED Installing github.com/stamblerre/gocode FAILED Installing github.com/ianthehat/godef FAILED Installing github.com/sqs/goreturns FAILED
當然我這裡就只是截取了小部分,因為我已經裝好了,也懶得卸載了再演示了。
開始我很盲目,沒有冷靜下來分析一下為什麼會出現這個原因。現在想來,當時確實很 naive,完全喪失掉了一枚程序員應當具有的沉著冷靜的風範。
我開始用搜索引擎尋找答案,發現找到的都是一些同類型的文章,而且大家的答案居然出奇的一致,就類似下面這樣:
大多數文章,差不多到這裡就戛然而止了。
我照著文章反覆的執行了好多次,每一次都前功盡棄了。因為每每總是 fail 掉了,還是有一堆插件沒裝上。
就在我開始氣妥的時候,勝利的曙光終於來臨了,命運女神開始眷顧我了。
我鬼使神差的看了一眼 C:Users ootgoin 目錄中的文件:
這一看,簡直讓我大跌眼鏡,我終於明白了這個 vs code 中 go 這個插件到底幹了啥,也明白了怎麼才能正確的裝上 go 插件調用的程序了。
原來 vs code 中的 go 插件,就是在 go 的環境變數中調用一些程序,來對 go 的源碼執行一些檢查、測試、格式化、重命名、代碼檢查等操作。
通過 go env 查看 go 的系統配置參數:
C:Users oot>go env set GOARCH=amd64 set GOBIN= set GOCACHE=C:Users ootAppDataLocalgo-build set GOEXE=.exe set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GOOS=windows set GOPATH=C:Users ootgo set GOPROXY= set GORACE= set GOROOT=D:Softwarego set GOTMPDIR= set GOTOOLDIR=D:Softwaregopkg oolwindows_amd64 set GCCGO=gccgo set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD= set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS= set CGO_CXXFLAGS=-g -O2 set CGO_FFLAGS=-g -O2 set CGO_LDFLAGS=-g -O2 set PKG_CONFIG=pkg-config set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:Users ootAppDataLocalTempgo-build998644522=/tmp/go-build -gno-record-gcc-switches
我們定位到 set GOPATH=C:Users ootgo 這一行,不難發現,我們的 go 程序的系統路徑在什麼地方。
通俗點來講,我們在 go 程序中經常會使用一些第三方的包,例如:
import ( "golang.org/x/tour/tree" "fmt" )
我們編譯我們的 go 程序的時候,就是從這個 gopath 下面的 src 文件夾中尋找我們的第三方包的。
換句話就是說,我們可以編寫一些自己的 go 擴展包,放在這裡文件夾裏,然後就可以直接全局引用了。
雖然我沒有看過 vs code 的 go 插件的源碼,但是現在我剛大膽的說,我已經瞭解 go 插件的使用哲學了。
它其實並沒有寫具體的工具(這是我的猜想),對 go 的源碼進行解析,而是調用 go 的一些優秀插件,對 go 源碼執行一些操作。
也就是說,除了 go 官方自帶的那些 格式化 等等插件以外,它會在 gopath 的 bin 目錄下尋找對應的工具,對 go 源碼執行操作。
如果這個工具沒找到,每次就會不厭其煩的提醒你,你沒有安裝對應的工具,然後彈出提示框,問你要不要安裝。
安裝的時候,也是從對應的 go 工具的 github 網站或 golang 官網下載。下下來以後放在 src 文件夾內,然後通過 go install 包名 安裝到 bin 目錄下,供下次調用的時候使用。
因此,對於下載不下來的插件,我們可以手動的在 github 或 golang 網站找到對應的工具包,放在對應的目錄中,然後對工具包進行編譯,將編譯後的二進位文件放在 bin 目錄下即可。
下面我就以安裝 goturns 這個插件為例,介紹一下怎麼手動安裝這些老是安裝不成功的插件。
其他插件安裝的原理也是一樣的,安裝的過程也是大同小異,學會了下面這個範例,就能舉一反三了。
從 Installing http://github.com/sqs/goreturns FAILED 這條提示信息我們可以看出來,這個插件所在的網址是多少。
我們打開我們的瀏覽器,在地址欄輸入 http://github.com/sqs/goreturns ,然後回車,就進入了插件的 github 頁面:
看到這裡,我想聰明的你不難明白,原來我們裝的插件就是 github 上開源的 go 插件,而 sqs 是用戶,goreturns 是項目名稱。
我們為了尊重插件的開發者,直接就按照 github 的頁面編排的目錄,直接把我們的項目克隆到 $GOPATHsrchttp://github.comsqsgoreturns 文件夾之中。
所以我們就在 $GOPATHsrchttp://github.com 目錄下,新建一個文件夾為 sqs 我想用過類 Unix 系統的用戶都應該明白了,我們相當於建了一個 sqs 用戶的個人文件夾,裡面可以放他個人的項目,而這個用戶本來是 http://github.com 的用戶。
打開我們的控制檯,在 $GOPATHsrchttp://github.comsqs 路徑下,執行 git clone [email protected]:sqs/goreturns.git 命令,將項目克隆到我們本地。
以下是在我電腦上執行的過程,可以看出來下載網速較慢,因此花了很長時間:
C:Users ootgosrcgithub.comsqs>git clone [email protected]:sqs/goreturns.git Cloning into goreturns... remote: Enumerating objects: 8, done. remote: Counting objects: 100% (8/8), done. remote: Compressing objects: 100% (5/5), done. remote: Total 152 (delta 3), reused 6 (delta 3), pack-reused 144 Receiving objects: 100% (152/152), 6.85 MiB | 5.00 KiB/s, done. Resolving deltas: 100% (79/79), done.
這裡不得不吐槽一下的是,不同電信運營商,對國外網站的支持程度也迥然不同。
我在公司克隆 github 項目,非常的快,但是在家裡就慢的出奇。我在公司根本打不開 coursera, 但是在家裡卻有不錯的速度。
完全的將項目克隆下來了以後,接下來要做的就是將項目編譯成對應的二進位文件。
瞭解 go 的你,應該明白 go 源文件是怎麼編譯的吧。
我們僅僅只需要,在對應的項目路徑下,執行 go install 命令,就能自動找對應的同名入口文件開始編譯。
看看我們的 goreturns 項目:
不看不覺得,一看我就覺得要吐血了,這位 sqs 用戶,對我們中國的開發者「太不友好了」,整個項目其實很小,源代碼就幾十 kb,但是 sqs 居然朝裡面塞了一個接近 6.5Mb 的 screencast.gif 文件。
然而,打開一看,也就是一個十秒左右的演示代碼使用的錄屏。這老哥(或老姐)不知道用的什麼錄製 gif 的軟體,錄屏的效率驚掉人的下巴了。
這也間接的「坑了」我們國內的開發者了,以我們克隆 github 項目的平均網速來看,本來十秒鐘能克隆下來的項目,這下好了,十分鐘也克隆不下來了。
執行了 go bulid 以後,我們的文件夾下就多了一個二進位文件 goreturns.exe 了
接下來要做的就是,將二進位文件複製或剪切到我們的 $GOPATHin 目錄下就大功告成了。
在 $GOPATHin 目錄下,直接執行命令 go install http://github.com/sqs/goreturns 命令,go 編譯程序就會自動的到 $GOPATHsrc 目錄下,找到對應的 goreturns 包,對其進行編譯,編譯後得到的二進位文件就在當前所在的 bin 目錄下了。
本來是一件很簡單很容易理解的事情,但是就是很難找到合適的直指核心本質的教程。
不得不感嘆,互聯網雖然資料很多,信息繁雜,但是真正想找到對你有用的資料,卻如同大海撈針。
不要浮躁,多想多實踐,共勉吧!
推薦閱讀: