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

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

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

一、安装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

(1)双击Git Shell,打开Git脚本窗口

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

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

本文转自qingkechina 51CTO博客,原文链接:http://blog.51cto.com/qingkechina/1681419,如需转载请自行联系原作者

【Go语言】【17】GO语言杂谈相关推荐

  1. 一本深入探讨C++11~C++17最新语言特性的书推荐给你

    近10年来C++的更新可谓是非常频繁,这让我在2017年时感受到了一丝不安.那个时候我发现在开源平台上已经有很多项目采用C++11和C++14标准编写,其中不乏一些知名的代码库,而公司里所用的编译环境 ...

  2. c语言常数-ox6a是什么意思,c语言1-7章课后作业答案

    c语言1-7章课后作业答案 51intn=0:char*s:if(argc1)for(s=argv1:*s:s+)if(A=*s&*s=Z)|(a=*s&*s=z)n+:elsen=0 ...

  3. DaVinci Resolve Studio 17中文语言设置教程

    达芬奇调色软件DaVinci Resolve Studio 17中文破解版是Blackmagic Design 旗下一款著名的调色软件,也是世界上唯一一款将专业8K编辑,色彩校正,视觉效果和音频后期制 ...

  4. 棱形旋转c语言程序_C 语言时隔 5 年重回巅峰,这 20 个热门项目拿去练手!

    在上个月的 TIOBE 编程语言排名中,C 语言和 Java 的差距只有 0.01%.在近日 TIOBE 公布的 2020 年 5 月编程语言排行榜中,C 语言成功超越了 Java,重返第一的王者宝座 ...

  5. python是高级动态语言_Python动态语言之魅力揭秘

    之前的文章跟大家讲解了鸭子类型,其实鸭子类型是编程语言中动态类型语言中的一种设计风格.今天跟大家一起谈谈动态语言的魅力. 根据维基百科,动态编程语言是这样子定义的:动态编程语言是高级编程语言的一个类别 ...

  6. java 与c 运行效率_Java语言与C语言代码运行效率的比较

    <Java语言与C语言代码运行效率的比较>由会员分享,可在线阅读,更多相关<Java语言与C语言代码运行效率的比较(2页珍藏版)>请在人人文库网上搜索. 1.Java语言与C语 ...

  7. c语言中switch语句流程图_C语言:C语言保留字(关键字)

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  8. 脚本语言和工程语言_语言工程中有趣的事情

    脚本语言和工程语言 如果您阅读此博客,您将知道我坚信语言的力量. 所以,我当然有很大的偏见,但是我感觉语言工程社区正在增长,并且越来越有趣的东西正在涌现. 为此,我认为通过查看社区中正在发生的事情并列 ...

  9. C语言 static - C语言零基础入门教程

    目录 一.static 简介 二.static 修饰变量 1.static 局部静态变量 2.static 全局静态变量 三.static 修饰函数 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

  10. C语言核心技术-C语言概述与开发环境搭建

    C语言概述 C语言发展简史 起源 1972年,贝尔实验室的Dennis Ritchie和Ken Thompson在开发Unix操作系统时设计了C语言,该操作系统的90%以上的代码都是由C语言实现,后期 ...

最新文章

  1. top 命令显示隐藏参数列
  2. 第二章-大数据处理框Hadoop
  3. 用VS Code打造最佳Markdown编辑器
  4. 【Python】Python中的关键字
  5. vue : 无法加载文件 XXXXXXX\vue.ps1,因为在此系统上禁止运行脚本。
  6. html控制弯曲图,html – CSS3 3D弯曲视角
  7. bzoj 3930: [CQOI2015]选数
  8. 牛客2022年除夕AK场
  9. 【语言模型系列】原理篇二:从ELMo到ALBERT
  10. 1081 Rational Sum (20 分) 分数计算+最大公约数
  11. 节假日查询API接口上线
  12. hdmi接口有什么用_显示器有哪些接口?DP、HDMI、VGA、DVI有什么区别?
  13. Python爬虫的数据提取,一篇博客就搞定啦!
  14. 诸葛亮司马懿大战房市
  15. 情报学的主要学术期刊
  16. 去弹窗软件——火绒安全软件
  17. suspend(挂起)和resume(继续执行)线程
  18. [科幻]一堂宇宙生物课
  19. umi2升级到umi3
  20. 蚂蚁员工发帖:硕士毕业7年,年薪百万,150万期权

热门文章

  1. 方正飞鸿:工作流在OA系统中的重要性
  2. USB大容量存储设备无法启动--这个设备(服务)的驱动程序已被禁用。另一个驱动程序可以提供这个功能。
  3. 「电商干货」分销爆单的6个步骤
  4. 安卓温升thermal介绍
  5. 4.(地图数据篇)nginx代理地图服务--离线部署地图服务
  6. markdown如何生成一级标题
  7. EduSoho教育周报(0805-0811)
  8. 16代表啥_16代表的爱情恋爱含义 16代表什么爱情含义
  9. Q绑查询HTML源码
  10. 360wifi驱动linux驱动安装,ubuntu安装360随身wifi驱动