GO语言杂谈

2558956ss · · 1012 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

本章节原想进一步写并写的相关知识,但今天不在状态临时改为杂谈,原因有二 我也想静静 (参见秋裤大叔) 对前面没有涉及到的问题给一个交待 一、安装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》,观看别人争吵也是学习的一种手段。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1012 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传