老王學習go語言——3.Go語言基礎 -第一個go程序

2020-09-19 開飛機的老王

慣例上書名《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,又是個新的知識點,為防止篇幅過長,咱們下一篇繼續。

相關焦點

  • 老王學習go語言——3.go語言基礎語法和關鍵字 gdb調試
    慣例書名放在最上面《go語言高並發與微服務實戰》開始基礎語法和關鍵字之前,上一篇遺留了幾個問題:go語言debug之Gdb Version,之前沒用過C++和C,所以對於Gdb不是很熟悉,也不想特別麻煩去搞,於是想偷個懶,利用網上的方法,去下載liteidex,準備利用裡面的gdb64.exe,但下載了最新版,裡面沒有gdb的可執行文件。
  • 「Go 語言教程」 Go語言結構
    Go 語言教程學習一門程式語言,除了學習語法,詞法,以及寫法等和編譯器有關的特性如hello.go, main.go 。2 包管理區別於C/C++,Go語言有包的概念,關鍵字package。Go語言的包管理主要有兩種類型的包:main包和正常的模塊化的包,模塊包。
  • 老王學習go語言——2.1 Go Kit和Go Micro
    https://gokit.io/faq/#introduction-mdash-understanding-go-kit-key-concepts這裡只挑重點列一下:1.go-Kit不是MVC框架,基礎結構是transport, EndPoint,Service,請求首先進入transport,然後是Endpoint,最後由Service來處理。
  • 「Go 語言教程」Go語言函數說明
    我們知道在程序設計中,模塊設計是最小的設計單元,模塊設計可以對應面相對象設計中的類設計,也可以對應到函數(方法)設計。編程中很多時候函數作為模塊設計的最小單元。函數設計也有很多方法和規定,以及設計原則。那麼go語言的函數都是怎麼樣子的,都有些什麼原則和要求呢,那麼怎麼做好函數方法設計呢,就讓我們一起來學習學習。
  • 老王學習go語言-- 1. 語言認知--解讀序言
    以示尊重,書名放最上面《go語言高並發與微服務實戰》本來以為隨便翻翻就能寫出點兒見解來,無非是語言,解決特點環境的特定問題。帶著這種先入為主的看法,因為要分享學習過程,所以算的上精讀了,看書從來都是拿來主義,從來不看作者,從來不看序言的我,很反常閱讀了續言。
  • google 公司的 go 語言學習筆記
    Go語言學習筆記程式設計師就是不停的學習和折騰中,想到啥就學到啥,公司需要啥就學啥,就是個無底洞。做前端多年,後端也想嘗試一下,那就學習唄,反正才32歲,還學的動。去官網下載了一個go語言的安裝包然後一步一步的安裝go語言環境,環境安裝很簡單,安裝完了就要安裝開發工具。我用到的開發工具是vscode編輯器。
  • 跟光磊學Go語言-Go語言概述與開發環境搭建
    安裝完成以後通過go version和go env命令來查看go的版本信息以及go的環境信息在開發第一個Go程序之前需要檢測Go語言的版本以及GOPATH環境變量的配置,在Go1.8版本以後不需要配置GOPATH這個環境變量,GOPATH就是Go程序的目錄(例如/Users/liuguanglei/Documents/workspace/go/ittimelinedotnet
  • [Go 語言教程] Go 語言簡介
    Go是靜態強類型語言,是區別於解析型語言的編譯型語言。解析型語言——原始碼是先翻譯為中間代碼,然後由解析器對代碼進行解釋執行。編譯型語言——原始碼編譯生成機器語言,然後由機器直接執行機器碼即可執行。2 Go語言特性跨平臺的編譯型語言語法接近C語言管道(channel),切片(slice),並發(routine)有垃圾回收的機制支持面向對象和面向過程的編程模式3 Go 語言特色編程模式比較簡單,沒有複雜的設計模式全部源碼編譯到一個文件,編譯速度很快最新版本也有動態庫形式
  • Go語言環境安裝
    技多不壓身,在學習過程中記錄下來,以備後續參考,希望對有同樣需求的小夥伴有所幫助。選擇一個print.go文件,通過window命令行工具運行go run命令,看看輸出效果。以上print.go測試了go語言中各類數據類型的列印結果輸出。
  • GO語言入門
    一、GO基礎1. GOPATH2.GO 命令源碼文件1)命令源碼文件定義:命令源碼文件是程序的運行入口,如果一個源碼文件聲明屬於main包,並且包含一個無參數聲明的main函數,那麼它就是命令源碼文件2)命令源碼文件接收參數的包:GO語言標準庫中有一個代碼包flag專門用於接收和解析程序參數A. flag.StringVar()flag.StringVar
  • 學習Go語言,看這一篇文章就夠了
    通過30個有用的備忘單學習Go的基礎知識> Source: the author它並不像C或C ++那樣難於學習,但仍然相當快,並且擁有一個強大的社區以及許多有趣且有用的軟體包和庫。該語言也是由Google計算機科學界的一些最聰明的人開發的。這些可能是查看Docker和Kubernetes編寫語言的足夠理由。 這是您需要入門的最終Golang備忘單。 玩得開心!目錄1.
  • 老王學習go語言-- 1.go語言的發展和淵源
    慣例還是把書名放在最前面《go語言高並發與微服務實戰》扭捏了半天,還是進入了正文部分,往往書的第一章總是要去回答幾個傳統問題,我是誰,從哪裡來,到哪裡去。而本書作者秉持著對血緣宗親的敬畏,先介紹了go語言的叔叔大爺,以及所處的時代,好吧,好飯不拍晚,這就像相親,咱們有點兒耐心,先了解了解雲原生和微服務。
  • 未來後端語言的趨勢——go語言免費學習網站大推薦!
    導語: Go語言是谷歌2009發布的第二款開源程式語言,以其可以媲美C或C++代碼的速度,而且更加安全、支持並行進程得到人們的喜愛。而它高並發的特性我相信它將在以後的後端語言中越來越流行!一.易百教程易百教程網的go語言教程是我首先要推薦的,為什麼呢?它相比於其它go語言教程網站的內容,除了一樣詳實的教程外,還增加了go編程代碼實例,最適合初次學習go語言的人邊看教程,變根據實例敲代碼。
  • 如何學習Golang?萬字詳文教你Go語言入門
    作者:ivansli,騰訊開發工程師在深入學習 Golang 的 runtime 和標準庫實現的時候發現,如果對 Golang 彙編沒有一定了解的話,很難深入了解其底層實現機制。在這裡整理總結了一份基礎的 Golang 彙編入門知識,通過學習之後能夠對其底層實現有一定的認識。
  • 快速轉型golang(go語言)web開發 03-Go語言的特點
    穩定的二進位接口go自發布1.0時,就承諾向後兼容,所以即使用高版本的go去運行之前用低版本go寫的代碼,一樣可以運行。這也是go可以作為工業級語言的前提。穩定的語言特性自1.0版發布以來,go很少像其它語言那樣在語言層面添加新的語法(再也不用擔心學不動了有木有)實實在在的性能go的每次版本升級,都會帶來或多或少的性能提升以及bug修復(所以對於程式設計師而言,我們就很省心了,不需要像學java那樣還得學很多額外的性能調優知識)Go語言 vs 其它技術棧Go的開發速度跟python
  • Go語言的魅力
    給周末無事,想充電的朋友分享一下我最近迷戀上了Go語言的理由[偷笑],起初讓我了解它,是它那幾位殿堂級的創始人,後來去年B站原始碼洩露,幾乎整站全是go語言架構,讓我映像深刻,而近年國內很多巨頭阿里,頭條,小米,360,美團,螞蟻,騰訊等的開源項目可見,go就是一門未來具有絕對魅力的語言,我很多朋友公司裡,無歷史包袱的新項目都在優先考慮golang架構。
  • 解讀Go語言的2020:變革前夜
    從基礎層面講,數字經濟的發展必須要有半導體等高精尖領域的強力支持。而從應用層面說,數字經濟將會依託於雲計算、大數據和人工智慧。更具體地說,雲計算是高級的基礎設施,大數據和人工智慧是建立在雲計算之上的高級應用。Go 語言,早已霸佔了雲計算的大半個江山,今後它也將在大數據和人工智慧方面發揮重要作用。
  • 快速轉型golang(go語言)web開發 03-Go語言的特點
    穩定的二進位接口go自發布1.0時,就承諾向後兼容,所以即使用高版本的go去運行之前用低版本go寫的代碼,一樣可以運行。這也是go可以作為工業級語言的前提。穩定的語言特性自1.0版發布以來,go很少像其它語言那樣在語言層面添加新的語法(再也不用擔心學不動了有木有)實實在在的性能go的每次版本升級,都會帶來或多或少的性能提升以及
  • 一次使用 Go 語言編寫腳本的經歷
    Go 語言區別於 Bash 和 Python 的地方是後者通過解釋執行,既它們的腳本在讀取的時候執行。而對於 Go 語言,當用戶輸入了 go run,Go 編譯這個 Go 程序,然後再執行。因為 Go 編譯時間非常短,所以看上去像是解釋執行。值得提醒的是,很多人都說「go run 只是一個玩具」,但是如果我們需要腳本,同時也喜歡 Go 語言,那麼這個玩具就是我們想要的。
  • 快速轉型golang(go語言)web開發 05-Go核心概念之 GOROOT
    上節回顧在上一節中,我們介紹了go的版本發布特點、並安裝了windows版的go,本節我們來了解一下go的第一個核心概念——GOROOT查看GOROOT打開一個命令行,在裡面輸入 go env命令行輸入go env後,輸出的內容出來長長的一大串,看上去眼花繚亂有木有,別慌,這裡面好多選項我們都會為大家介紹,今天我們先講其中一個——GOROOT,就是圖片裡最下面那個。