本章節原想進一步寫並寫的相關知識,但今天不在狀態臨時改爲雜談,原因有二
我也想靜靜 (參見秋褲大叔)
對前面沒有涉及到的問題給一個交待
一、安裝Git
當下是一個開源的時代,經常遛論壇的朋友肯定會遇到不少開源的組件、框架等,比如
前端JS有Angular
服務端框架有Spring
數據庫有Cockroach DB
雲計算的PaaS有Cloud Foundary
就連GO都是開源語言,謝大針對GO搞了一個Beego框架等等,不勝枚舉......
既然有這麼多的開源,那總得有一個地方放這些開源代碼吧(即代碼倉庫),所以Github就應時而生,具體網址爲https://github.com/;好吧,Github是一個存放開源代碼的倉庫,作爲開源的愛好者若想要貢獻點代碼,就需要有一個能提交代碼的客戶端,於是我們下面就說一下Git客戶端的安裝:
1、打開Github網址
要安裝Git客戶端,首先要下載;若要下載就得打開github.com,然後拖到網頁的最下面,看到類似下圖鏈接
2、下載Github
在1中點擊“Download GitHub for Windows”後,就會開始下載,下載完畢後看到下面圖標
3、安裝Github
雙擊進行安裝,由於它是在亞馬遜公有云的S3上存儲的,所以下載時間稍微會慢一些
安裝完畢後界面上會出現兩個圖標,一個是GUI形式的,一個是腳本形式的
二、什麼是GOPATH?
使用Go寫代碼有一個環境變量GOPATH需要設置,這個變量起什麼作用呢?我們可以這樣理解:“Go的工作空間是一個目錄 ,該目錄由src、pkg、bin三個目錄,而GOPATH就是Go語言關聯工作空間的變量!”,例如:
把Go語言安裝在E:\盤,那麼環境變量GOROOT即爲E:\Go
要寫Go代碼,把代碼存放在E:\Go\workspace\src下,那麼環境變量GOPATH即爲E:\Go\workspace
三、使用Beego開發Web應用
1、什麼是Beego?
引用謝大的beego簡介原話吧:“beego 是一個快速開發 Go 應用的 HTTP 框架,他可以用來快速開發 API、Web 及後端服務等各種應用,是一個 RESTful 的框架,主要設計靈感來源於 tornado、sinatra 和 flask 這三個框架,但是結合了 Go 本身的一些特性(interface、struct 嵌入等)而設計的一個框架“
2、下載Beego
(2)切換到GOPATH路徑。由於我是使用的win8操作系統,同時把GOPATH設置爲E:\Go\workspace,所以需要先切換到E盤,使用“cd E:”實現切換,而不是“E:”回車
(3)下載beego代碼
執行go get github.com/astaxie/beego
若沒有報錯說明下載成功,同時會在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
3、下載bee
爲了快速地搭建Web工程,beego爲我們提供了一個工具(bee)
執行go get github.com/beego/bee
稍等一下若沒有報錯,說明下載成功,其目錄結構如下:
在E:\Go\workspace下自動創建了一個src目錄,在src下創建了github.com目錄,裏面有兩個工程,分別對應着beego和bee
4、創建Web工程
(1)先進入src目錄
執行cd src
(2)創建Web工程pwm
執行bee new pwm,其中pwm爲工程名
此時的目錄結構如下:
與前面比較可以發現,在src目錄下多了一個pwm目錄,裏面放置着文件夾和文件。從名稱上不難猜測,conf應該是放置工程配置文件的;controllers對應着MVC的C,裏面應該是放控制器文件的;models對應着M,裏面應該是放模型數據文件的......
5、運行Web工程
(1)進入pwm目錄
執行cd pwm
(2)啓動pwm工程的main.go主函數
執行go run main.go
在執行期間沒有出現問題的話,會打印出如上圖的信息“http server Running on :8080”,告訴Web服務已啓動,監聽端口爲8080。
當然若出現端口衝突可以修改pwm/conf/app.conf文件
(3)在瀏覽器中輸入http://localhost:8080查看運行結果
我非常喜歡這個圖標,很有寓意,相當於給Go語言的logo穿上了蜜蜂衣 :)
當然在這個Web工程中我們什麼都沒有做,全由bee工具幫我們做好了,若我們想進一步想開發Web,就需要在pwm這個工程上縫縫補補就可以了。
三、接口賦值
前段時間看許式偉寫的《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”,即向上轉型,孩子具備父親的特徵,不需要強制轉型。
1、下面我們改造一下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)
這個錯誤告訴我們,Integer並沒有實現LessAdder,即Integer的方法並沒有實現LessAdder定義的兩個方法。我們Just修改了Add()方法,哪該如何辦呢?
2、修改測試方法
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接口。 |
如果感覺還是不得其意,建議把上面這段話讀個五、六遍......
(其實我是站在內存的角度上來理解的,有興趣的讀者可以嘗試用這個角度來解釋,當然也可以私信交流)
四、Go語言的是是非非
世界向來就是具有兩面性的,有讚的當然有批的;
我不是Go語言的專家,沒有資格來參與到Go語言的是是非非之中,但感興趣的讀者可以閱讀一下鏈接《http://www.ituring.com.cn/article/37642》,觀看別人爭吵也是學習的一種手段。