十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
Go語言自亮相以來并沒有展示一個明確的方向,Google員工將Go語言稱為一個“試驗性語言”,稱其試圖融合Python等動態(tài)語言的開發(fā)速度和C或C++等編譯語言的性能和安全。一位Go語言的支持者概括而言Go語言如下:簡單、快速、安全、并發(fā)、快樂編程、開源;但Go語言缺乏方向以及其“集大成者”的嘗試很容易會導(dǎo)致其學(xué)貓不成學(xué)狗也不成,淪為四不像。盡管如此,編者仍然覺得Go語言有相當大的潛力:很多開發(fā)者對它感興趣——不僅它的最初設(shè)計者陣容強大,而且在參與修改源代碼的人群中也不乏大牛級人物。這很有可能幫助Go語言找到適合自己的方向,開拓系統(tǒng)編程的新方向。
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計與策劃設(shè)計,大姚網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:大姚等地區(qū)。大姚做網(wǎng)站價格咨詢:18982081108
轉(zhuǎn)載請參見文章末尾處的要求?!靖兄x張佳偉(@ghosert)的熱心翻譯。如果其他朋友也有不錯的原創(chuàng)或譯文,可以嘗試推薦給伯樂在線。】這是一篇(長)博文, 介紹了我們在 Repustate 遷移大量 Python/Cython 代碼到 Go 語言的經(jīng)驗。如果你想了解整個故事,背景和所有的事情,請繼續(xù)往下讀。如果你只是想了解 Python 開發(fā)者在一頭扎進 Go 語言前需要了解什么,請點擊一下鏈接:從Python遷移到Go的建議(Tips Tricks) 背景在Repustate,我們完成過的最棒的技術(shù)成就之一是實現(xiàn)了阿拉伯語的情感分析。阿拉伯語是一塊難啃的硬骨頭,因為它的詞形變化相當復(fù)雜。比起譬如英語,阿拉伯語的分詞(將一個句子切分呈幾個獨立的單詞)也更困難,因為阿拉伯語的單詞本身還可能會包含空白字符(例如:“阿列夫”在一個單詞里的位置)。這也談不上是泄密,Repustate 使用支持向量機(SVM)來獲取一個句子背后最有可能的含義,并在其中加上情感元素。 總體上來說,我們使用了 22 種模型(22 個 SVM) 并且在一篇文檔中,每一個單詞我們都會加以分析。因此如果你有一篇 500 字的文檔,那么基于 SVM,會進行十萬次的比較。 PythonRepustate 幾乎完全就是一個 Python 商店。我們使用 Django 來實現(xiàn) API 和網(wǎng)站。因此(目前)為了保持代碼一致,同時使用 Python 來實現(xiàn)阿拉伯語情感引擎是合情合理的。只是做原型和實現(xiàn)的話,Python 是很好的選擇。它的表達能力很強悍,第三方類庫等等也很好。如果你就是為了Web服務(wù),Python 很完美。但是當你進行低級別的計算,大量依賴于哈希表(Python 里的字典類型)做比較的時候,一切都變慢了。我們每秒能處理大約兩到三個阿拉伯文檔,但是這太慢了。比較下來,我們的英語情感引擎每秒能處理大約五百份文檔。 瓶頸因此我們開啟了 Python 分析器,開始調(diào)查是什么地方用了那么長時間。還記得我前面說過我們有 22 個 SVM 并且每個單詞都需要經(jīng)過處理嗎?好吧,這些都是線性處理的,非并行處理。所以我們的第一反應(yīng)是把線性處理改成 map/reduce 那樣的操作。簡單來說:Python 不太適合用作 map/reduce。當你需要并發(fā)的時候,Python 算上好用。在 2013 Python 大會上(譯者:PyCon 2013),Guido 談到了 Tulip,他的這個新項目正在彌補 Python 這方面的不足,不過得過段一段時間才能推出,但是如果已經(jīng)有了更好用的東西,我們?yōu)槭裁催€要等呢? 選Go 語言,還是回家算了?我在Mozilla的朋友告訴我,Mozilla 內(nèi)部正在將他們大量的基礎(chǔ)日志架構(gòu)切換到 Go 語言上,部分原因是因為強大的 [goroutines]。Go 語言是 Google 的人設(shè)計的,并且在設(shè)計之初就把支持并發(fā)作為第一要務(wù),而不是像 Python 的各種解決方案那樣是事后才加上去的。因此我們開始著手把 Python 換成 Go 語言。雖然Go 代碼還不算正式上線的產(chǎn)品,但是結(jié)果非常令人鼓舞。我們現(xiàn)在能做到每秒處理一千份文檔,使用更少的內(nèi)存,還不用調(diào)試你在 Python 里遇到:丑陋的多進程/gevent/“為什么 Control-C 殺不了進程”這些問題。 為什么我們喜歡 Go 語言任何人,對編程語言是如何工作(解釋型 vs 編譯型, 動態(tài)語言 vs 靜態(tài)語言)有一點理解的話,會說,“切,當然 Go 語言會更快”。是的,我們也可以用 Java 把所有的東西重寫一遍,也能看到類似更快的改善,但那不是 Go 語言勝出的原因。你用 Go 寫的代碼好像就是對的。我搞不清楚到底是怎么回事,但是一旦代碼被編譯了(編譯速度很快),你就會覺得這代碼能工作(不只是跑起來不會錯,而且甚至邏輯上也是對的)。我知道,這聽上去不太靠譜,但是確實如此。這和 Python 在冗余(或非冗余)方面非常類似,它把函數(shù)作為第一目標,因此函數(shù)編程會很容易想明白。而且當然,go 線程和通道讓你的生活更容易,你可以得到靜態(tài)類型帶來的性能大提升,還能更精細的控制內(nèi)存分配,而你卻不必為此在語言表達力上付出太多的代價。 希望能早點知道的事情(Tips Tricks)除去所有這些贊美之詞以后,有時你真的需要在處理 Go 代碼的時候,相對于 Python,改變一下思維方式。因此這是我在遷移代碼時記錄的筆記清單 —— 只是在我把 Python 代碼轉(zhuǎn)換到 Go 時從我腦子里隨機冒出來的點子:沒有內(nèi)建的集合類型(必須使用map,并檢查是否存在)因為沒有集合,必須自己寫交集,并集之類的方法沒有tuples 類型,必須寫你自己的結(jié)構(gòu),或者使用 slices (即數(shù)組)沒有類似 \__getattr__() 的方法,你必須總是檢查存在性,而不是設(shè)置默認值,例如,在 Python 里,你可以這樣寫 value = dict.get(“a_key”, “default_value”)必須總是檢查錯誤(或者顯式的忽略錯誤)不能有變量/包沒被使用,因此簡單的測試也需要有時注掉一些代碼在[] byte 和 string 之間轉(zhuǎn)換。 regexp 使用 [] byte (不可變)。這是對的,但是老把一些變量轉(zhuǎn)換來轉(zhuǎn)換去很煩人Python 更寬松。你可以使用超出范圍的索引在字符串里取一個片段,而且不會出錯。你還可以用負數(shù)取出片段,但是 Go 不行你不能混合數(shù)據(jù)結(jié)構(gòu)類型。也許這樣也不太干凈,但是有時在 Python 里,我會使用值是混合了字符串和列表的字典。但是 Go 不行,你不得不清理干凈你的數(shù)據(jù)結(jié)構(gòu)或者使用自定義的結(jié)構(gòu)不能解包一個 tuple 或者 list 到幾個不同的變量(例如:x, y, z = [1, 2, 3])駝峰式命名風格(如果你沒有首字大寫方法名/結(jié)構(gòu)名,他們不會被暴露給其它的包)。我更喜歡 Python 的小寫字母加下劃線命名風格。必須顯式檢查是否有錯誤 != nil, 不像在 Python 里,許多類型可以像 bool 那樣檢查 (0, “”, None 都可以被解釋成 “非” 集合)文檔在一些模塊上太散亂了,例如(crypto/md5),但是 IRC 上的 go-nuts 很好用,提供了巨大的幫助。從數(shù)字到字符串的轉(zhuǎn)換(int64 - string) 和 []byte - string (只要使用 string([]byte))不太一樣。需要使用 strconv。閱讀Go 代碼比起 Python 那樣寫起來如偽代碼的語言更像一門編程語言, Go 有更多的非字母數(shù)字字符,并且使用 || 和 , 而不是 “or”和“and”寫一個文件的話,有 File.Write([]byte) 和 File.WriteString(string), 這點和 Python 開發(fā)者的 Python 之道:“解決問題就一種方法 ”相違背。修改字符串很困難,必須經(jīng)常重排 fmt.Sprintf沒有構(gòu)造函數(shù),因此慣用法是創(chuàng)建 NewType() 方法來返回你要的結(jié)構(gòu)Else (或者 else if)必須正確格式化,else 得和 if 配對的大括號在同一行。奇怪。賦值運算符取決于在函數(shù)內(nèi)還是函數(shù)外,例如,= 和 :=如果我只想要“鍵”或者只想要 “值”,譬如: dict.keys() 或者 dict.values(),或者一個 tuples 的列表,例如:dict.items(),在 Go 語言里沒有等價的東西,你只能自己枚舉 map 來構(gòu)造你的列表類型我有時使用一種習慣用法:構(gòu)造一個值是函數(shù)的字典類型,我想通過給定的鍵值調(diào)用這些函數(shù),你在 Go 里可以做到,但是所有的函數(shù)必須接受,返回相同的東西,例如:相同的方法簽名如果你使用 JSON 并且 你的 JSON 是一個復(fù)合類型,恭喜你。 你必須構(gòu)造自定義的結(jié)構(gòu)匹配 JSON 塊里的格式,然后把原始 JSON 解析到你自定義結(jié)構(gòu)的實例中去。比起 Python 世界里 object = json.loads(json_blob) 要做更多的工作 是不是值得?值得,一百萬倍的值得。速度的提升太多了,以致很難舍棄。同時,我認為, Go 是目前趨勢所在,因此在招新員工的時候,我認為把 Go 當作 Repustate 技術(shù)積累的重要一環(huán)會很有幫助。]
vs2013快速定位一個函數(shù)或者變量或者類的快捷鍵是F12,不是ctrl+鼠標左鍵。
VS( Visual Studio ):
Microsoft Visual Studio(簡稱VS)是美國微軟公司的開發(fā)工具包系列產(chǎn)品。VS是一個基本完整的開發(fā)工具集,它包括了整個軟件生命周期中所需要的大部分工具,如UML工具、代碼管控工具、集成開發(fā)環(huán)境(IDE)等等。所寫的目標代碼適用于微軟支持的所有平臺,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。
Visual Studio是目前最流行的Windows平臺應(yīng)用程序的集成開發(fā)環(huán)境。最新版本為 Visual Studio 2015 版本,基于.NET Framework 4.5.2 。
我喜歡jetbrains系列的IDE+go插件。不過我要說的是這個問題主要看你的觀點如何。
說eclipse:
構(gòu)建方式是使用go install 命令,每一次編譯運行都是go install。這樣的好處就是如果你有很多的包,下載下來并沒有編譯,這樣每次編譯速度是很快的。而且(?。ゞo install 符合go官方的項目結(jié)構(gòu),官方說過了,一個go的項目應(yīng)該是以個gopath,包含src,pkg,bin三個主要目錄。所以說go install個人認為才是主要的go編譯方式。
說eclipse的缺點:
其實eclipse插件的go編譯方式,還有目錄結(jié)構(gòu),項目結(jié)構(gòu),都是非常完美的!?。?!真的很完美!可是,他的代碼提示,太差件!大括號都不能自動補全,gdb 32bit 64bit兼容問題,eclipseC++ 沒有html js插件,需要手動安裝,幾乎不能開箱即用。不過如果你是開發(fā)算法,數(shù)據(jù)處理,還是推薦eclipse的,畢竟其他都無關(guān)緊要。
說jetbrains:
說先說clione肯定不適合,新建項目沒有向?qū)?,?dǎo)致改成go項目各種不開心,比如圖標對于我來說就無法接受go lib 不是小耗子~這是次要的,重要的是各個文件都是灰色的(沒有在cmake中包含的結(jié)果),然后說剩下的,phpstorm這個不說了,估計很少有人插件按在這里,webstorm,體驗也不是很好,idea?體驗很好,可是畢竟比較重,尤其是現(xiàn)在加入了自家的K啥玩意(無意冒犯,沒記住單詞)~可是話說回來,go跟C系列IDE配合才是最佳,跟java系列一點不搭關(guān)系,用idea似乎有點格格不入,但是!idea支持新建項目向?qū)?,lib的圖標也很清晰,最后還是選擇idea吧,期待clion的強大起來!
再說jetbrains系列缺點:
插件的構(gòu)建方式是go buiild 這個讓人很不爽,我們幾乎不確定會構(gòu)建到什么地方去,還要每次設(shè)置一下run配置。這個可能無關(guān)緊要,畢竟不是什么大的毛病,可是go build不能緩存.a文件,直接構(gòu)建的結(jié)果就是很多第三方包的情況下很慢!所以建議安裝包的時候手動install 一下解決這個問題。自帶代碼格式化,這個格式化跟go 格格不入,總的來說就是蛋疼,心碎,菊花癢。
最后說liteIDE:
輕量級IDE,我可以說是國人GO偉大作品典范,然而默認構(gòu)建也是go build,項目管理方式不符合go官方標準。代碼提示不能自動導(dǎo)入(eclipse也不能),不過如果你的項目是以包為單位的,那么另當別論。一定很不錯,畢竟是輕量級專門針對GO的IDE!
說這些,其實還有很大一部分取決于你的項目是用vendor機制管理,還是godeps機制管理依賴關(guān)系。go不像java擁有強大的幾乎天下一統(tǒng)的maven(無意冒犯,暫不評價其他構(gòu)建套件)。
go沒有官方包倉庫。
go沒有官方包管理工具。
go沒有官方自動化構(gòu)建套件。
上面三個沒有是致命要害。導(dǎo)致民間各種百花齊放。
說說我的項目怎么管理
gpm 一個shell工具(windows下你可以用git的bash,或者cygwin~)
我是嚴格艷照官方推薦方式管理go項目,一個go項目一個gopath。系統(tǒng)的gopath只是為了安裝go命令,我沒有配置gobin,意義不大。
項目的依賴跟我的代碼包都在src下(非vendor)
vendor用來存放包的特殊依賴,發(fā)布項目直接把依賴包發(fā)布上去(公網(wǎng)管理則只上傳依賴關(guān)系文件 godeps文件)
資源文件等都放在src目錄同級,編譯文件放在bin,引用直接../引用。
作為一個測試,作為一個測試開發(fā), 全?;?管理 是我們未來的發(fā)展方向。已經(jīng)掌握了Java、Python、HTML的你,是不是也想了解下最近異常火爆的Go語言呢?來吧,讓我們一起了解下。
Go 是一個開源的編程語言 ,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時候發(fā)布了Go 1穩(wěn)定版本?,F(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個活躍的社區(qū)。這三個人都是計算機界的大神,有的參與了C語言的編寫,有的還是數(shù)學(xué)大神,有的還獲得了計算機最高榮譽-圖靈獎。
接下來說說 Go語言的特色 :
簡潔、快速、安全
并行、有趣、開源
內(nèi)存管理、數(shù)組安全、編譯迅速
Go語言的用途 :
Go 語言被設(shè)計成一門應(yīng)用于搭載 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。
對于高性能分布式系統(tǒng)領(lǐng)域而言,Go 語言無疑比大多數(shù)其它語言有著更高的開發(fā)效率。它提供了海量并行的支持,這對于 游戲 服務(wù)端的開發(fā)而言是再好不過了。
Go語言的環(huán)境安裝:
建議直接打開 官方地址因為墻的原因打不開
因為我用的是windows系統(tǒng),這里主要講下Windows系統(tǒng)上使用Go語言來編程。
Windows 下可以使用 .msi 后綴(在下載列表中可以找到該文件,如go1.17.2.windows-amd64.msi)的安裝包來安裝。
默認情況下 .msi 文件會安裝在 c:Go 目錄下。你可以將 c:Gobin 目錄添加到 Path 環(huán)境變量中。添加后你需要重啟命令窗口才能生效。個人建議還是安裝到 Program Files文件夾中。
使用什么開發(fā)工具來對Go語言進行編寫:
個人建議用VS code, 也可以用Sublime Text來編輯。如果你之前看了我講的HTML語言的學(xué)習,肯定已經(jīng)下載了VS code. 那么這時你需要在VS code中下載Go語言的擴展插件。
這里有一個巨大的坑,就是在下載Go的插件和依賴包時,會提示一些包沒有。主要是因為下載的依賴包部分被墻了,只能想別的辦法去下載。
建議參考網(wǎng)頁:
解決vscode中g(shù)olang插件安裝失敗方法
在學(xué)習go的過程中,使用的是vscode,但是一直提示安裝相關(guān)插件失敗,然后上網(wǎng)查方法,基本上是叫你建立golang.org目錄什么的,結(jié)果全是錯的,而且都是抄襲,很煩。無意之中看到一位博主分享的方法,他也是飽受上述的垃圾博文困擾,然后找到了解決方法,這里向他致敬,秉著讓更多人看到正確解決方法的心,我寫下正確的解決方法,希望對你有所幫助,也可以點開原博主鏈接參考:
Go有一個全球模塊代理,設(shè)置代理再去安裝golang的插件,就可以安裝成功了。步驟有,首先Windows用戶打開Powershell,一個藍色的界面,注意不是cmd!不知道的直接打開window下面的搜索,然后輸入powershell,搜索出來就可以了。
$env:GO111MODULE=“on”
$env:GOPROXY=“”
go env -w GOPROXY=
go env -w GOPRIVATE=*.corp.example.com
然后我們打開VsCode界面,下面會提示安裝插件,我們選擇Install ALL,就會安裝成功
當你在運行Go語言程序時,提示所有的插件包都已經(jīng)安裝成功了時,就可以正常使用了,要不然一堆報錯會讓你非常心煩。
好了,今天先到這里,晚安、下班~