慣例上書名《Go語言高並發與微服務實戰》
第一部分 Go語言生平
Go出身名門,是鼎鼎大名的google的親兒子,至於是不是唯一語言方面的兒子,這個我查了一下,Baidu沒告訴我,姑且認為他是google的獨生子吧,如果還有其他的,請各位提示孤陋寡聞的我。
Go出生於2007年,09年由於表現優異,就開源了。
Go出生的年代網際網路已經有了長足的發展,所以Go從出生起就面對的是海量,高並發的網際網路大潮,所以從胎教開始,Go語言就練就了一身本領,到2009年開源,2012年正式穩定版本發布,Go語言就已經在處理多核並發以及開發效率,挖掘計算機CPU資源,網絡編程和並發編程等方面體現出了很強的實力。對了Go還是一個政治上過硬的好小夥,在垃圾分類在各大城市進行的如火如荼的情況下,Go能夠自動進行垃圾回收,而且開放包容,不計較函數有多個返回值。
這當然得益於,Go從底層支持協程並發以及靜態類型安全。
接著,Go用自己的優勢,又孵化了Docker,Kubernetes和Etcd等現在縱橫江湖的開源項目。
一段生平介紹完,不能免俗還得先安裝個環境,輸出個helloWorld,因為本文不是教人安環境的教程。而且這個未免太基礎,不適合在這麼「...」的文章裡講。請各位自行學習吧。無非是下載安裝包,設置環境變量,(這裡書裡有一點我補充一下,windows下,根據安裝包不停的下一步之後,GoPATH必須重新設置,設置成一個自定義路徑,用來存放程序包,設置完成以後就算安裝成功了,其他環境變量安裝包會自動設置)通過命令查看version證明安裝成功一類。我就不贅述了。
但IDE這個方面要多囉嗦兩句,老王從事軟體開發也算小20年了,一直以來堅持的是所有付費的咱都不用,而且付費的IDE註定會。。。,Go 都是開源的,你搞個IDE還收費,別怪老王不研究你,看在你提供30天免費試用期的情面上,也不研究你。
另外呢,Eclipse作為伴隨我事件最長的IDE,前段時間學PHP我用的就是他,所以自然我會考慮有沒有Go語言的插件,我回頭問了一下百度,果然不負眾望,插件名字叫GoClipse。於是動手安裝。安裝過程截圖如下,首先到Eclipse ->help找到Eclipse Market
首先到Eclipse ->help找到Eclipse Market
搜索Goclipse
不管是啥,點同意,你沒得選擇,你不同意那就沒有然後了
這個同上,你trust也得trust,不trust也得trust
一步步安裝結束,重啟Eclipse,我勒個去,Could Not Start
雖然could not start,還是看到了Welcome頁面,你跟我鬧呢
這是後新建個工程已經能看到go Project了
其實安裝GoClipse插件前,我都沒下載Go語言包,不知道上面那個錯誤是不是因為這個,也懶得管他了,我就當安裝成功了,稍後再來解決你。
睡了幾個小時,好吧,準備來解決這個問題吧。
既然是java version的問題,我先看一下本地的java 環境
我的java版本是11.0.7,懷疑是java版本過高了。既然eclipse是開源的,打算去看看goclipse源碼,看看版本依賴的原因是什麼,不要像我這樣,每個東西都想抓住線索,問題會一直擴散,先找百度,把問題解決了,後邊有空,騰出手再來找原因是可取的,不會再不相干的路徑上浪費太多時間。
通過查看原始碼,發現在環境啟動時會進行JVM的參數檢查。
public interface JvmCheckConstants_Actual {
String FEATURE_NAME = &34;;
int REQUIRED_JAVA_VERSION = 8;
}
if(javaVersion >= REQUIRED_JAVA_VERSION)
return;
而原則上我的javaVersion是大於8的,那問題就變成了為什麼javaVersion取到的是0,
public static String getJavaVersionProperty() {
return System.getProperty(&34;);
}
public static int getJavaVersion() {
String versionProperty = getJavaVersionProperty();
String[] versionSegments = versionProperty.split(&34;);
if(versionSegments.length < 2) {
return -1;
}
String javaVersionStr = versionSegments[1];
try {
return Integer.parseInt(javaVersionStr);
} catch(NumberFormatException e) {
return -1;
}
}
分析上面的代碼也就不難發現由於是取得是數組第二個元素,所以11.0.7取到0也就不意外了。
那怎麼解決呢,沒有打算降低JDK或者JRE版本,所以打算外掛一個JDK1.8,單獨給他使用。不知道效果如何。JDK的安裝過程就不在這裡展現了。
我直接下載了JRE1.8,解壓縮到自定義的目錄(我直接解壓到C盤根目錄了),然後在eclipse.ini裡添加(如果有興趣-vm參數的語法和作用請自行百度。)
-vm
C:\jre1.8.0_261\bin\javaw.exe
重新啟動eclipse,問題解決
這時候嘗試去new一個新項目,發現還有些配置要做。
修改完成以後,新建go Project,順利創建,創建成功後的試圖和目錄結構如下:
每一個新建工程都會按照幾個結構自動生成bin,pkg和src文件夾。而這三個目錄分別用來存放編譯後的可執行文件,編譯時生成的中間文件和原始碼。
而隨後我就迫不及待的想嘗試下能不能運行,於是我就新建了一個go file,
這裡有三種文件類型分別是 Package Source File,Command Source File和Test Source File
隨便選個類型在SRC目錄下新建hello.go
然後build
系統提示,SRC文件夾下允許存放.go文件,需要新建個子目錄來存放。
新建子目錄hello,新建文件類型選擇package Source file或者testSource File,然後直接運行。直接build,系統報錯
這是因為Go語言規定可執行程序必須具備main包,具備可以執行函數main的go文件必須位於該包下。
為了儘快看到我們的hello World,省略中間的驗證過程,咱們直接選擇文件類型為Command Source File,下拉類別中選擇 Simple Web Server
package main
import (
&34;
&34;
)
// Default Request Handler
func defaultHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, &34;, r.URL.Path[1:])
}
func main() {
http.HandleFunc(&34;, defaultHandler)
http.ListenAndServe(&34;, nil)
}
框架自動生成代碼如上,其實無論是什麼語言,有一定編程和英文基礎就能看懂上面的代碼:
package main,上面也說過每個可執行goc程序,必須具備main包,而且main函數要在main包裡,package main其實就是指定了包名,這個有點兒類似於其他程式語言的namespace,但感官上還是存在區別,namespace和package應該還是有區別的。有興趣的同學可以去研究一下。
import 引入net下的http包和fmt包,這個就更容易理解了。
下面生面一個方法 defaultHander,關鍵字func用來聲明方法,可以看到main方法前面也是func,
這種風格其實在很多語言裡都有,但C和java省略的函數關鍵字,直接通過public,static,返回值類型等來標識和修飾函數,
而go當前看起來就是 func yourFuncname(參數)來聲明一個函數,由於語言本身支持多返回值,所以函數聲明當中沒有返回值類型的聲明
而defaultHandler函數功能其實也很簡單,就是列印hello以及後面的參數,這種佔位輸出方式,做過編程的應該都能看懂。
main函數指定由defaultHandler來處理8080埠的請求。其實看完基本也就明白了,這個程序監聽8080埠的http請求,輸出hello 和Url.path
咱們先編譯,把程序運行起來。
編譯完成之後我們看到bin目錄底下新生成了hello.exe文件。(可以通過eclipse run這個程序,也可以直接雙擊這個文件來運行exe,雙擊運行的結果是如果你要停止運行,需要手動在任務管理器結束這個進程。建議還是在eclipse運行。)
運行成功,自此我們的第一個Go程序成功運行。
大概總結一下本章:
1)go系出名門,出身顯赫,同時戰功卓著,又創造了k8s,Docker這些生命顯赫的工具。
2)開發之前需要具備go語言開發包,這個直接官網下載就可以,下載安裝完成以後,需要設計環境變量,這裡有一個GoPATH需要特別關注,這是用來存放源文件的文件夾。工程也需要建在這個文件夾下。還有一個GoRoot是go語言包的安裝目錄。
3)go的開發可以完全命令行,或者採用商用或者其他IDE,我由於比較熟悉eclipse,沿用了eclipse,但是需要安裝goclipse插件。插件要求jdk版本至少是8或者更高,但由於java在version命名上風格有變化,導致java最新版本取到的版本號為0,可以重新下載個java1.8的jre,並修改eclipse.ini文件。有興趣的同學也可以修改goclipse原始碼的版本檢查方式,探索下最新版本的java版本,goclipse是否能正常運行。
4)eclipse成功運行後還要指定和配置Go語言包的安裝路徑。之後我們就可以愉快的進入Go的開發了
5)Go語言有幾個規定
a.源文件不能直接放在src目錄下,必須新建子目錄,這跟go的打包方式有關。
b.Go程序必須包含main包,main方法必須位於main包下。
c.Go行尾不需要使用;號進行分割
d.func關鍵字用來聲明方法,不需要指定返回值類型。
我們看到瀏覽器顯示Hello,但是沒有Url.path,我們來debug一下。
好吧,gdb--version,又是個新的知識點,為防止篇幅過長,咱們下一篇繼續。