【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》,观看别人争吵也是学习的一种手段。

相关文章
相关标签/搜索