Go語言的跨平臺能力到底有多強?看完你就知道了

構建方式

對比於其他語言的程序,Go語言的跨平臺能力是真的強,拿.Net和JAVA來說吧,.Net在.Net core出現之前是不能跨平臺的,只能在windows上編譯運行,即使是.net core出現以後,跨平臺的程序也是相當的麻煩。而java雖然一直都可以跨平臺,但是運行JAVA程序的機器上也必須要有JAVA程序運行環境JRE。而相對於Go程序,跨平臺就簡單的多了,只需要在編譯指定目標程序運行的架構和環境即可編譯出指定操作系統和架構的程序。

 #  cpu架構
 go env -w GOARCH=amd64  
 #  程序運行的最終系統,linux、windows、darwin(蘋果macos系統)
 go env -w GOOS=linux  
 #  window編譯設置Cgo模塊關閉,因爲windows上做cgo開發太麻煩,如果引用了Cgo庫庫,那麼請在linux環境開發、編譯  
 go env -w CGO_ENABLED=0   
  #  編譯出最終可執行文件,進入根目錄(GinSkeleton所在目錄,也就是 go.mod 所在的目錄)
  #  編譯時建議追加參數:-ldflags "-w -s"  ,同時會壓縮編譯後的體積。
  #  -w 表示去除調試信息,禁止gdb調試,
  #  -s 表示去除符號表(符號表在鏈接時起着按符號尋址的作用,靜態編譯後用不到)
  #  追加參數編譯後的程序體積也會比原來減少25%左右.
  #   -trimpath  表示去除絕對路徑信息,只保留基於 go.mod 開始的相對路徑信息
  # web|api|cli 三個目錄選擇其一即可,表示編譯的入口目錄  
  go build -o demo  -ldflags "-w -s"  -trimpath  cmd/(web|api|cli)/main.go

以上是指定了go的環境變量後執行的go build命令進行目標程序的構建,這種方式會一直生效的,如果不讓他一直生效,可以在構建的時候臨時指定環境變量,下面以window的環境爲例,來介紹臨時指定環境變量的方式構建可以在Linux環境下運行的可執行程序:

set GOARCH=amd64
set GOOS=linux 
set CGO_ENABLED=0
#在go程序的根目錄執行構建命令
go build -o demo .

可以根據不同的架構和操作系統將其編寫爲不同的.bat的可執行文件放置在程序的根目錄,Linux的和MAC的也一樣編寫成腳本文件放置在程序的根目錄,這樣在構建的時候就不用再敲命令了,直接運行腳本就可以了。

運行方式

Java程序編譯打包後爲war包或者是java包,必須執行java -jar 命令或者將其放置到tomcat的指定目錄下,運行tomcat程序。而Go語言編寫的程序最終爲可執行的文件(window下編譯出的是.exe的可執行文件),只需要將其賦予可執行的權限就可以直接運行了。

容器方式

構建JAVA程序的鏡像需要指定java的基礎鏡像,否則就需要在鏡像中安裝java的運行環境了,下面展示的是構建的一個JAVA程序的鏡像,構建出來鏡像的體積相對比較大

#docker run -itd --name eladmin -p 8000:8000 -v f:/docker/eladmin/config/:/usr/local/config/ -v f:/docker/eladmin/file:/home/eladmin/file -v f:/docker/eladmin/avatar:/home/eladmin/avatar eladmin:v1
# 基礎鏡像使用java
FROM java:8
# 作者
MAINTAINER limingqi 
# VOLUME 指定了臨時文件目錄爲/tmp。
# 其效果是在主機 /var/lib/docker 目錄下創建了一個臨時文件,並鏈接到容器的/tmp
#VOLUME /tmp
# 將jar包添加到容器中並更名爲app.jar
#ADD demo-0.0.1-SNAPSHOT.jar app.jar
WORKDIR /usr/local
ARG JAR_FILE=eladmin-system/target/eladmin-system-1.0.jar
COPY ${JAR_FILE} app.jar
COPY eladmin-system/src/main/resources/config/ config/
EXPOSE 8000
# 運行jar包
RUN bash -c 'touch app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

而Go程序製作出的鏡像就不需要安裝任何的依賴環境,因爲他在打包的時候就已經將依賴的包一塊打包到一起了

# 指定基礎鏡像
FROM busybox
#指定工作目錄
WORKDIR /demo
# copy可執行文件demo到工作目錄
COPY demo .
#授權
RUN chmod +x demo
#對外暴露端口
EXPOSE 8080
# 執行 可執行文件。
CMD ["./demo"]

拿着這個鏡像就可以到處運行了。

通過對比我們可以發現,如果沒有之前的技術和業務的積累,重新開發一個新的項目,使用go去開發無疑是最容易上手的,所以現在很多公司都使用go進行開發,也逐漸將其他語言的項目逐步的用go語言進行改造。其實用什麼語言不重要,合適的才重要,開發項目在選擇語言的時候也會綜合多方面來考慮選擇合適的語言和架構,畢竟很多公司都不是搞研究的,都需要項目來賺錢,所以開發的速度、客戶的滿意度、項目交付的時間纔是驅動公司技術的主要因素。

我們個人也應該不斷完善自己的技術棧,不應該太依靠某種語言,最重要的還是自己的架構思想和底層架構知識,只有掌握了這些才能夠不被社會和公司“優化”。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。