继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【Go语言】【17】GO语言杂谈

holdtom
关注TA
已关注
手记 1703
粉丝 240
获赞 991


本章节原想进一步写并写的相关知识,但今天不在状态临时改为杂谈,原因有二

我也想静静 (参见秋裤大叔)

对前面没有涉及到的问题给一个交待

一、安装Git

   当下是一个开源的时代,经常遛论坛的朋友肯定会遇到不少开源的组件、框架等,比如

前端JS有Angular

服务端框架有Spring

数据库有Cockroach DB

云计算的PaaS有Cloud Foundary

   就连GO都是开源语言,谢大针对GO搞了一个Beego框架等等,不胜枚举......

     既然有这么多的开源,那总得有一个地方放这些开源代码吧(即代码仓库),所以Github就应时而生,具体网址为https://github.com/;好吧,Github是一个存放开源代码的仓库,作为开源的爱好者若想要贡献点代码,就需要有一个能提交代码的客户端,于是我们下面就说一下Git客户端的安装:

1、打开Github网址

     要安装Git客户端,首先要下载;若要下载就得打开github.com,然后拖到网页的最下面,看到类似下图链接  

wKiom1Wvp57zBr19AACrpwgzjGY542.jpg

2、下载Github

      在1中点击“Download GitHub for Windows”后,就会开始下载,下载完毕后看到下面图标

  wKioL1WvqcPSJ6NnAAAv1wXbWcM782.jpg

3、安装Github      

      双击进行安装,由于它是在亚马逊公有云的S3上存储的,所以下载时间稍微会慢一些

      wKioL1Wvqd-i1Mm5AAERV4R3xUY393.jpg

      安装完毕后界面上会出现两个图标,一个是GUI形式的,一个是脚本形式的

   wKiom1WvqOegkMvGAAAhGX9movY405.jpg

二、什么是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

(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

3、下载bee

为了快速地搭建Web工程,beego为我们提供了一个工具(bee)

执行go get github.com/beego/bee

wKioL1W8Bzfyo2yeAAFaqrJ42lk547.jpg

稍等一下若没有报错,说明下载成功,其目录结构如下:

wKioL1W8B-7yyYFdAACEZSopSf4172.jpg

在E:\Go\workspace下自动创建了一个src目录,在src下创建了github.com目录,里面有两个工程,分别对应着beego和bee

4、创建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,里面应该是放模型数据文件的......

5、运行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这个工程上缝缝补补就可以了。

三、接口赋值

前段时间看许式伟写的《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)

j_0013.gif

这个错误告诉我们,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》,观看别人争吵也是学习的一种手段。

附件:http://down.51cto.com/data/2365983

©著作权归作者所有:来自51CTO博客作者qingkechina的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP