對(duì)比于其他語言的程序,Go語言的跨平臺(tái)能力是真的強(qiáng),拿.Net和JAVA來說吧,.Net在.Net core出現(xiàn)之前是不能跨平臺(tái)的,只能在windows上編譯運(yùn)行,即使是.net core出現(xiàn)以后,跨平臺(tái)的程序也是相當(dāng)?shù)穆闊?。而java雖然一直都可以跨平臺(tái),但是運(yùn)行JAVA程序的機(jī)器上也必須要有JAVA程序運(yùn)行環(huán)境JRE。而相對(duì)于Go程序,跨平臺(tái)就簡(jiǎn)單的多了,只需要在編譯指定目標(biāo)程序運(yùn)行的架構(gòu)和環(huán)境即可編譯出指定操作系統(tǒng)和架構(gòu)的程序。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、興寧網(wǎng)站維護(hù)、網(wǎng)站推廣。
以上是指定了go的環(huán)境變量后執(zhí)行的go build命令進(jìn)行目標(biāo)程序的構(gòu)建,這種方式會(huì)一直生效的,如果不讓他一直生效,可以在構(gòu)建的時(shí)候臨時(shí)指定環(huán)境變量,下面以window的環(huán)境為例,來介紹臨時(shí)指定環(huán)境變量的方式構(gòu)建可以在Linux環(huán)境下運(yùn)行的可執(zhí)行程序:
可以根據(jù)不同的架構(gòu)和操作系統(tǒng)將其編寫為不同的.bat的可執(zhí)行文件放置在程序的根目錄,Linux的和MAC的也一樣編寫成腳本文件放置在程序的根目錄,這樣在構(gòu)建的時(shí)候就不用再敲命令了,直接運(yùn)行腳本就可以了。
Java程序編譯打包后為war包或者是java包,必須執(zhí)行java -jar 命令或者將其放置到tomcat的指定目錄下,運(yùn)行tomcat程序。而Go語言編寫的程序最終為可執(zhí)行的文件(window下編譯出的是.exe的可執(zhí)行文件),只需要將其賦予可執(zhí)行的權(quán)限就可以直接運(yùn)行了。
構(gòu)建JAVA程序的鏡像需要指定java的基礎(chǔ)鏡像,否則就需要在鏡像中安裝java的運(yùn)行環(huán)境了,下面展示的是構(gòu)建的一個(gè)JAVA程序的鏡像,構(gòu)建出來鏡像的體積相對(duì)比較大
而Go程序制作出的鏡像就不需要安裝任何的依賴環(huán)境,因?yàn)樗诖虬臅r(shí)候就已經(jīng)將依賴的包一塊打包到一起了
拿著這個(gè)鏡像就可以到處運(yùn)行了。
通過對(duì)比我們可以發(fā)現(xiàn),如果沒有之前的技術(shù)和業(yè)務(wù)的積累,重新開發(fā)一個(gè)新的項(xiàng)目,使用go去開發(fā)無疑是最容易上手的,所以現(xiàn)在很多公司都使用go進(jìn)行開發(fā),也逐漸將其他語言的項(xiàng)目逐步的用go語言進(jìn)行改造。其實(shí)用什么語言不重要,合適的才重要,開發(fā)項(xiàng)目在選擇語言的時(shí)候也會(huì)綜合多方面來考慮選擇合適的語言和架構(gòu),畢竟很多公司都不是搞研究的,都需要項(xiàng)目來賺錢,所以開發(fā)的速度、客戶的滿意度、項(xiàng)目交付的時(shí)間才是驅(qū)動(dòng)公司技術(shù)的主要因素。
我們個(gè)人也應(yīng)該不斷完善自己的技術(shù)棧,不應(yīng)該太依靠某種語言,最重要的還是自己的架構(gòu)思想和底層架構(gòu)知識(shí),只有掌握了這些才能夠不被 社會(huì) 和公司“優(yōu)化”。
GraphicsMagick,一款高性能的圖片處理工具,由于項(xiàng)目需要,用到它,自然而然用到了關(guān)于gm的第三方庫(kù) 這個(gè)庫(kù)按照作者的提示,要安裝GraphicsMagick-devel依賴。
項(xiàng)目寫完了,接下來用alpine做為基礎(chǔ)鏡像,準(zhǔn)備制作項(xiàng)目的鏡像。
golang項(xiàng)目,是在ubuntu下編寫的,編譯成二進(jìn)制文件了,只要把二進(jìn)制文件放進(jìn)鏡像里即可,遇到的問題有2個(gè)
1 容器跑起來,一直報(bào)二進(jìn)制文件no found
我認(rèn)認(rèn)真真的確認(rèn)了文件,以及它的路徑,確實(shí)是存在的,怎么會(huì)報(bào)文件找不到呢?!
原來是musl和glibc是兼容的問題,在Dockerfile里要加以下兩步
2 Error loading shared library libGraphicsMagickWand-Q16.so.2: No such file or directory
明明按要求安裝GraphicsMagick-devel依賴,為啥還報(bào)這種錯(cuò)
于是想到了,是不是也要ln做一下軟鏈接呢?于是學(xué)著上面的樣子在Dockerfile里補(bǔ)上
再跑,問題依舊,莫非是軟連接的地址寫錯(cuò)了!回到開發(fā)的電腦上用ldd命令查看一下
果然,編譯后的二進(jìn)制文件依賴路徑是/lib,而不是/lib64
于是,修改Dockerfile里的寫法
問題解決,開心:)
參考資料:
python和go語言的區(qū)別
1、語法
Python的語法使用縮進(jìn)來指示代碼塊。Go的語法基于打開和關(guān)閉括號(hào)。
2、范例
Python是一種基于面向?qū)ο缶幊痰亩喾妒?,命令式和函?shù)式編程語言。它堅(jiān)持這樣一種觀點(diǎn),即如果一種語言在某些情境中表現(xiàn)出某種特定的方式,理想情況下它應(yīng)該在所有情境中都有相似的作用。但是,它又不是純粹的OOP語言,它不支持強(qiáng)封裝,這是OOP的主要原則之一。
Go是一種基于并發(fā)編程范式的過程編程語言,它與C具有表面相似性。實(shí)際上,Go更像是C的更新版本。
3、并發(fā)
Python沒有提供內(nèi)置的并發(fā)機(jī)制,而Go有內(nèi)置的并發(fā)機(jī)制。
4、類型化
Python是動(dòng)態(tài)類型語言,而Go是一種靜態(tài)類型語言,它實(shí)際上有助于在編譯時(shí)捕獲錯(cuò)誤,這可以進(jìn)一步減少生產(chǎn)后期的嚴(yán)重錯(cuò)誤。
5、安全性
Python是一種強(qiáng)類型語言,它是經(jīng)過編譯的,因此增加了一層安全性。Go具有分配給每個(gè)變量的類型,因此,它提供了安全性。但是,如果發(fā)生任何錯(cuò)誤,用戶需要自己運(yùn)行整個(gè)代碼。
6、管理內(nèi)存
Go允許程序員在很大程度上管理內(nèi)存。而,Python中的內(nèi)存管理完全自動(dòng)化并由Python VM管理;它不允許程序員對(duì)內(nèi)存管理負(fù)責(zé)。
7、庫(kù)
與Go相比,Python提供的庫(kù)數(shù)量要大得多。然而,Go仍然是新的,并且還沒有取得很大進(jìn)展。
8、速度:
Go的速度遠(yuǎn)遠(yuǎn)超過Python。
使用golang的鏡像編譯golang 應(yīng)用
但是,如果用到了vendor自己本地的庫(kù)的話,這個(gè)里就行不通,解決方案就是
先創(chuàng)建一個(gè)包含所有工程的完整鏡像,在用這個(gè)鏡像來編譯引用
Dockerfile_compile
Dockerfile_build