【Go语言】【17】GO语言杂谈
本章節(jié)原想進(jìn)一步寫并寫的相關(guān)知識(shí),但今天不在狀態(tài)臨時(shí)改為雜談,原因有二
-
我也想靜靜 (參見秋褲大叔)
-
對(duì)前面沒有涉及到的問題給一個(gè)交待
一、安裝Git
? ?當(dāng)下是一個(gè)開源的時(shí)代,經(jīng)常遛論壇的朋友肯定會(huì)遇到不少開源的組件、框架等,比如
-
前端JS有Angular
-
服務(wù)端框架有Spring
-
數(shù)據(jù)庫有Cockroach DB
-
云計(jì)算的PaaS有Cloud Foundary
? ?就連GO都是開源語言,謝大針對(duì)GO搞了一個(gè)Beego框架等等,不勝枚舉......
? ? ?既然有這么多的開源,那總得有一個(gè)地方放這些開源代碼吧(即代碼倉庫),所以Github就應(yīng)時(shí)而生,具體網(wǎng)址為https://github.com/;好吧,Github是一個(gè)存放開源代碼的倉庫,作為開源的愛好者若想要貢獻(xiàn)點(diǎn)代碼,就需要有一個(gè)能提交代碼的客戶端,于是我們下面就說一下Git客戶端的安裝:
1、打開Github網(wǎng)址
? ? ?要安裝Git客戶端,首先要下載;若要下載就得打開github.com,然后拖到網(wǎng)頁的最下面,看到類似下圖鏈接??
2、下載Github
? ? ? 在1中點(diǎn)擊“Download GitHub for Windows”后,就會(huì)開始下載,下載完畢后看到下面圖標(biāo)
??
3、安裝Github? ? ??
? ? ? 雙擊進(jìn)行安裝,由于它是在亞馬遜公有云的S3上存儲(chǔ)的,所以下載時(shí)間稍微會(huì)慢一些
? ? ??
? ? ? 安裝完畢后界面上會(huì)出現(xiàn)兩個(gè)圖標(biāo),一個(gè)是GUI形式的,一個(gè)是腳本形式的
? ?
二、什么是GOPATH?
? ? ? ?使用Go寫代碼有一個(gè)環(huán)境變量GOPATH需要設(shè)置,這個(gè)變量起什么作用呢?我們可以這樣理解:“Go的工作空間是一個(gè)目錄 ,該目錄由src、pkg、bin三個(gè)目錄,而GOPATH就是Go語言關(guān)聯(lián)工作空間的變量!”,例如:
-
把Go語言安裝在E:\盤,那么環(huán)境變量GOROOT即為E:\Go
-
要寫Go代碼,把代碼存放在E:\Go\workspace\src下,那么環(huán)境變量GOPATH即為E:\Go\workspace
三、使用Beego開發(fā)Web應(yīng)用
1、什么是Beego?
? ? ?引用謝大的beego簡(jiǎn)介原話吧:“beego 是一個(gè)快速開發(fā) Go 應(yīng)用的 HTTP 框架,他可以用來快速開發(fā) API、Web 及后端服務(wù)等各種應(yīng)用,是一個(gè) RESTful 的框架,主要設(shè)計(jì)靈感來源于 tornado、sinatra 和 flask 這三個(gè)框架,但是結(jié)合了 Go 本身的一些特性(interface、struct 嵌入等)而設(shè)計(jì)的一個(gè)框架“
2、下載Beego
(1)雙擊Git Shell,打開Git腳本窗口
(2)切換到GOPATH路徑。由于我是使用的win8操作系統(tǒng),同時(shí)把GOPATH設(shè)置為E:\Go\workspace,所以需要先切換到E盤,使用“cd E:”實(shí)現(xiàn)切換,而不是“E:”回車
(3)下載beego代碼
執(zhí)行g(shù)o get github.com/astaxie/beego
若沒有報(bào)錯(cuò)說明下載成功,同時(shí)會(huì)在GOPATH下生成pkg、src兩個(gè)文件夾,同時(shí)src下有beego代碼
【備注】:若使用上網(wǎng)代理的話,需要配置代理,即在C:\Users\xxxx\.gitconfig文件中增加
[http]
????proxy = proxycn8.pwm.com:8080 sslVerify = false
[https]
????proxy = proxycn8.pwm.com:8080 sslVerify = false
3、下載bee
為了快速地搭建Web工程,beego為我們提供了一個(gè)工具(bee)
執(zhí)行g(shù)o get github.com/beego/bee
稍等一下若沒有報(bào)錯(cuò),說明下載成功,其目錄結(jié)構(gòu)如下:
在E:\Go\workspace下自動(dòng)創(chuàng)建了一個(gè)src目錄,在src下創(chuàng)建了github.com目錄,里面有兩個(gè)工程,分別對(duì)應(yīng)著beego和bee
4、創(chuàng)建Web工程
(1)先進(jìn)入src目錄
執(zhí)行cd src
(2)創(chuàng)建Web工程pwm
執(zhí)行bee new pwm,其中pwm為工程名
此時(shí)的目錄結(jié)構(gòu)如下:
與前面比較可以發(fā)現(xiàn),在src目錄下多了一個(gè)pwm目錄,里面放置著文件夾和文件。從名稱上不難猜測(cè),conf應(yīng)該是放置工程配置文件的;controllers對(duì)應(yīng)著MVC的C,里面應(yīng)該是放控制器文件的;models對(duì)應(yīng)著M,里面應(yīng)該是放模型數(shù)據(jù)文件的......
5、運(yùn)行Web工程
(1)進(jìn)入pwm目錄
執(zhí)行cd pwm
(2)啟動(dòng)pwm工程的main.go主函數(shù)
執(zhí)行g(shù)o run main.go
在執(zhí)行期間沒有出現(xiàn)問題的話,會(huì)打印出如上圖的信息“http server Running on :8080”,告訴Web服務(wù)已啟動(dòng),監(jiān)聽端口為8080。
當(dāng)然若出現(xiàn)端口沖突可以修改pwm/conf/app.conf文件
(3)在瀏覽器中輸入http://localhost:8080查看運(yùn)行結(jié)果 ?
我非常喜歡這個(gè)圖標(biāo),很有寓意,相當(dāng)于給Go語言的logo穿上了蜜蜂衣 :)
當(dāng)然在這個(gè)Web工程中我們什么都沒有做,全由bee工具幫我們做好了,若我們想進(jìn)一步想開發(fā)Web,就需要在pwm這個(gè)工程上縫縫補(bǔ)補(bǔ)就可以了。
三、接口賦值
前段時(shí)間看許式偉寫的《Go語言編程》一書,里面提及到接口賦值,感覺挺新穎,拿過來分享一下:
定義LessAdder接口,里面定義Less、Add兩個(gè)方法
| type LessAdder interface { ? ? ? ? Less(b Integer) bool ? ? ? ? Add(b Integer) } |
定義一個(gè)類型,讓它實(shí)現(xiàn)這兩個(gè)方法
| type Integer int func (a Integer) Less(b Integer) bool { ? ? ? ? return a < b } func (a Integer) Add(b Integer) { ? ? ? ? a += b } |
根據(jù)Go語言特點(diǎn),類型實(shí)現(xiàn)了接口中定義的方法,就相當(dāng)于Integer繼承了該接口(非侵入式),所以測(cè)試代碼為:
| var a Integer = 1 var la LessAdder = a ??// 重點(diǎn)關(guān)注此行,把Integer類型賦值給LessAdder類型 fmt.Println("la = ", la) |
運(yùn)行該代碼會(huì)發(fā)現(xiàn)程序正常,沒有錯(cuò)誤拋出。這說明該行為與繼承是一致的,按《Java編程思想》的叫說:“is-a”,即向上轉(zhuǎn)型,孩子具備父親的特征,不需要強(qiáng)制轉(zhuǎn)型。
1、下面我們改造一下Integer的Add()方法:
因?yàn)槟壳暗腁dd()沒有意義,它沒有定義返回值,同時(shí)由于是值傳遞,所以這個(gè)方法無法獲得a+b的值,修改如下
| // 采用指針的方法獲取a + b的值 func (a *Integer) Add(b Integer) { ? ? ? ? *a += b } |
運(yùn)行會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了
.\main.go:24:?cannot use a (type Integer) as type LessAdder in assignment:
Integer does not implement LessAdder (Add method has pointer receiver)
這個(gè)錯(cuò)誤告訴我們,Integer并沒有實(shí)現(xiàn)LessAdder,即Integer的方法并沒有實(shí)現(xiàn)LessAdder定義的兩個(gè)方法。我們Just修改了Add()方法,哪該如何辦呢?
2、修改測(cè)試方法
| var a Integer = 1 var la LessAdder =?&a ? // 與上面不同這里把變量a的地址賦給LessAdder fmt.Println("la = ", la) |
再運(yùn)行發(fā)現(xiàn)正常了,這是為什么?許式偉這樣解釋:
| Go語言可以根據(jù)下面的函數(shù): func (a Integer) Less (b Integer) bool 自動(dòng)生成一個(gè)新的Less()方法: func (a *Integer) Less(b Integer) bool{ ? ? ? ?return (*a).Less(b) } 這樣,類型*Integer就既存在Less()方法,也存在Add()方法,滿足LessAdder接口。 而從另一方面來說,根據(jù) func (a *Integer) Add(b Integer) 這個(gè)函數(shù)無法自動(dòng)生成以下這個(gè)成員方法: func (a Integer) Add(b Integer){ ? ? ? ?(&a).Add(b) } 因此類型Integer只存在Less()方法,缺少Add()方法,不滿足 LessAdder接口。 因?yàn)?&a).Add()改變的只是函數(shù)參數(shù)a,對(duì)外部實(shí)際要操作的對(duì)象并無影響,這不符合用戶的預(yù)期,所以Go語言不會(huì)自動(dòng)為其生成該函數(shù)。因此類型Integer只存在Less()方法,缺少Add()方法,不滿足LessAdder接口。 |
如果感覺還是不得其意,建議把上面這段話讀個(gè)五、六遍......
(其實(shí)我是站在內(nèi)存的角度上來理解的,有興趣的讀者可以嘗試用這個(gè)角度來解釋,當(dāng)然也可以私信交流)
四、Go語言的是是非非
世界向來就是具有兩面性的,有贊的當(dāng)然有批的;
我不是Go語言的專家,沒有資格來參與到Go語言的是是非非之中,但感興趣的讀者可以閱讀一下鏈接《http://www.ituring.com.cn/article/37642》,觀看別人爭(zhēng)吵也是學(xué)習(xí)的一種手段。
附件:http://down.51cto.com/data/2365983
? ? ?本文轉(zhuǎn)自qingkechina 51CTO博客,原文鏈接:http://blog.51cto.com/qingkechina/1681419,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的【Go语言】【17】GO语言杂谈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python系列之:字典update
- 下一篇: 柳传志回应“联想5G投票事件”:不要罔顾