【Go語言】【17】GO語言雜談

本章節原想進一步寫並寫的相關知識,但今天不在狀態臨時改成雜談,緣由有二前端

  • 我也想靜靜 (參見秋褲大叔)git

  • 對前面沒有涉及到的問題給一個交待github


1、安裝Git數據庫

   當下是一個開源的時代,常常遛論壇的朋友確定會遇到很多開源的組件、框架等,好比編程

  • 前端JS有Angularflask

  • 服務端框架有Spring後端

  • 數據庫有Cockroach DB瀏覽器

  • 雲計算的PaaS有Cloud Foundaryapp

   就連GO都是開源語言,謝大針對GO搞了一個Beego框架等等,不勝枚舉......框架


     既然有這麼多的開源,那總得有一個地方放這些開源代碼吧(即代碼倉庫),因此Github就應時而生,具體網址爲https://github.com/;好吧,Github是一個存放開源代碼的倉庫,做爲開源的愛好者若想要貢獻點代碼,就須要有一個能提交代碼的客戶端,因而咱們下面就說一下Git客戶端的安裝:

一、打開Github網址

     要安裝Git客戶端,首先要下載;若要下載就得打開github.com,而後拖到網頁的最下面,看到相似下圖連接  

wKiom1Wvp57zBr19AACrpwgzjGY542.jpg

二、下載Github

      在1中點擊「Download GitHub for Windows」後,就會開始下載,下載完畢後看到下面圖標

  wKioL1WvqcPSJ6NnAAAv1wXbWcM782.jpg

三、安裝Github      

      雙擊進行安裝,因爲它是在亞馬遜公有云的S3上存儲的,因此下載時間稍微會慢一些

      wKioL1Wvqd-i1Mm5AAERV4R3xUY393.jpg

      安裝完畢後界面上會出現兩個圖標,一個是GUI形式的,一個是腳本形式的

   wKiom1WvqOegkMvGAAAhGX9movY405.jpg


2、什麼是GOPATH?

       使用Go寫代碼有一個環境變量GOPATH須要設置,這個變量起什麼做用呢?咱們能夠這樣理解:「Go的工做空間是一個目錄 ,該目錄由src、pkg、bin三個目錄,而GOPATH是Go語言關聯工做空間的變量!」,例如:

  • 把Go語言安裝在E:\盤,那麼環境變量GOROOT即爲E:\Go

  • 要寫Go代碼,把代碼存放在E:\Go\workspace\src下,那麼環境變量GOPATH即爲E:\Go\workspace


3、使用Beego開發Web應用

一、什麼是Beego?

     引用謝大的beego簡介原話吧:「beego 是一個快速開發 Go 應用的 HTTP 框架,他能夠用來快速開發 API、Web 及後端服務等各類應用,是一個 RESTful 的框架,主要設計靈感來源於 tornado、sinatra 和 flask 這三個框架,可是結合了 Go 自己的一些特性(interface、struct 嵌入等)而設計的一個框架「


二、下載Beego

(1)雙擊Git Shell,打開Git腳本窗口wKiom1W0oXDjOPGbAADr3uNOl1Y742.jpg

(2)切換到GOPATH路徑。因爲我是使用的win8操做系統,同時把GOPATH設置爲E:\Go\workspace,因此須要先切換到E盤,使用「cd E:」實現切換,而不是「E:」回車

wKioL1W0pByyAQbpAAFEitx8xCU643.jpg

(3)下載beego代碼

執行go get github.com/astaxie/beego

wKiom1W0oznDTDzOAAF7pjkWFJA759.jpg

若沒有報錯說明下載成功,同時會在GOPATH下生成pkg、src兩個文件夾,同時src下有beego代碼


【備註】:若使用上網代理的話,須要配置代理,即在C:\Users\xxxx\.gitconfig文件中增長

[http]

    proxy = proxycn8.pwm.com:8080 sslVerify = false

[https]

    proxy = proxycn8.pwm.com:8080 sslVerify = false



三、下載bee

爲了快速地搭建Web工程,beego爲咱們提供了一個工具(bee)

執行go get github.com/beego/bee

wKioL1W8Bzfyo2yeAAFaqrJ42lk547.jpg

稍等一下若沒有報錯,說明下載成功,其目錄結構以下:

wKioL1W8B-7yyYFdAACEZSopSf4172.jpg

在E:\Go\workspace下自動建立了一個src目錄,在src下建立了github.com目錄,裏面有兩個工程,分別對應着beego和bee


四、建立Web工程

(1)先進入src目錄

執行cd src

wKiom1W8BwqiSb9fAAFwbAD6aSw629.jpg

(2)建立Web工程pwm

執行bee new pwm,其中pwm爲工程名

wKioL1W8CWPDcBVDAANpzEGlWRo415.jpg

此時的目錄結構以下:

wKiom1W8CAzQOLgBAAC-2GhgWio738.jpg

與前面比較能夠發現,在src目錄下多了一個pwm目錄,裏面放置着文件夾和文件。從名稱上不難猜想,conf應該是放置工程配置文件的;controllers對應着MVC的C,裏面應該是放控制器文件的;models對應着M,裏面應該是放模型數據文件的......


五、運行Web工程

(1)進入pwm目錄

執行cd pwm

wKioL1W8CzrBy2vXAAKpmtne9fw406.jpg

(2)啓動pwm工程的main.go主函數

執行go run main.go

wKiom1W8CcWB40dSAAL3tv9AIuA374.jpg

在執行期間沒有出現問題的話,會打印出如上圖的信息「http server Running on :8080」,告訴Web服務已啓動,監聽端口爲8080。

固然若出現端口衝突能夠修改pwm/conf/app.conf文件

(3)在瀏覽器中輸入http://localhost:8080查看運行結果  

wKiom1W8Cp3A3qOXAACB-pJjWhw933.jpg

我很是喜歡這個圖標,頗有寓意,至關於給Go語言的logo穿上了蜜蜂衣 :)


固然在這個Web工程中咱們什麼都沒有作,全由bee工具幫咱們作好了,若咱們想進一步想開發Web,就須要在pwm這個工程上縫縫補補就能夠了。



3、接口賦值

前段時間看許式偉寫的《Go語言編程》一書,裏面說起到接口賦值,感受挺新穎,拿過來分享一下:

定義LessAdder接口,裏面定義Less、Add兩個方法

type LessAdder interface {

        Less(b Integer) bool

        Add(b Integer)

}

定義一個類型,讓它實現這兩個方法

type Integer int


func (a Integer) Less(b Integer) bool {

        return a < b

}


func (a Integer) Add(b Integer) {

        a += b

}

根據Go語言特色,類型實現了接口中定義的方法,就至關於Integer繼承了該接口(非侵入式),因此測試代碼爲:


var a Integer = 1

var la LessAdder = a   // 重點關注此行,把Integer類型賦值給LessAdder類型

fmt.Println("la = ", la)

運行該代碼會發現程序正常,沒有錯誤拋出。這說明該行爲與繼承是一致的,按《Java編程思想》的叫說:「is-a」,即向上轉型,孩子具有父親的特徵,不須要強制轉型。


一、下面咱們改造一下Integer的Add()方法:

由於目前的Add()沒有意義,它沒有定義返回值,同時因爲是值傳遞,因此這個方法沒法得到a+b的值,修改以下

// 採用指針的方法獲取a + b的值

func (a *Integer) Add(b Integer) {

        *a += b

}

運行會發現報錯了

.\main.go:24: cannot use a (type Integer) as type LessAdder in assignment:

Integer does not implement LessAdder (Add method has pointer receiver)

j_0013.gif

這個錯誤告訴咱們,Integer並無實現LessAdder,即Integer的方法並無實現LessAdder定義的兩個方法。咱們Just修改了Add()方法,哪該如何辦呢?


二、修改測試方法

var a Integer = 1

var la LessAdder = &a   // 與上面不一樣這裏把變量a的地址賦給LessAdder

fmt.Println("la = ", la)

再運行發現正常了,這是爲何?許式偉這樣解釋:

Go語言能夠根據下面的函數:

func (a Integer) Less (b Integer) bool

自動生成一個新的Less()方法:

func (a *Integer) Less(b Integer) bool{

       return (*a).Less(b)

}

這樣,類型*Integer就既存在Less()方法,也存在Add()方法,知足LessAdder接口。


而從另外一方面來講,根據

func (a *Integer) Add(b Integer)

這個函數沒法自動生成如下這個成員方法:

func (a Integer) Add(b Integer){

       (&a).Add(b)

}

所以類型Integer只存在Less()方法,缺乏Add()方法,不知足LessAdder接口。


由於(&a).Add()改變的只是函數參數a,對外部實際要操做的對象並沒有影響,這不符合用戶的預期,因此Go語言不會自動爲其生成該函數。所以類型Integer只存在Less()方法,缺乏Add()方法,不知足LessAdder接口。

若是感受仍是不得其意,建議把上面這段話讀個5、六遍......

(其實我是站在內存的角度上來理解的,有興趣的讀者能夠嘗試用這個角度來解釋,固然也能夠私信交流)


4、Go語言的是是非非

世界向來就是具備兩面性的,有讚的固然有批的;

我不是Go語言的專家,沒有資格來參與到Go語言的是是非非之中,但感興趣的讀者能夠閱讀一下連接《http://www.ituring.com.cn/article/37642》,觀看別人爭吵也是學習的一種手段。

相關文章
相關標籤/搜索