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

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

  • 我也想静静 (参见秋裤大叔)
  • 对前面没有涉及到的问题给一个交待

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

时间: 2024-11-08 20:21:12

【Go语言】【17】GO语言杂谈的相关文章

编译性语言不如解释性语言跨平台性好

编译性语言例如c语言:用c语言开发了程序后,需要通过编译器把程序编译成机器语言(即计算机识别的二进制文件,因为不同的操作系统计算机识别的二进制文件是不同的),所以c语言程序进行移植后,要重新编译. 解释性语言,例如java语言,java程序首先通过编译器编译成class文件,如果在windows平台上运行,则通过windows平台上的java虚拟机(VM)进行解释.如果运行在linux平台上,则通过linux平台上的java虚拟机进行解释执行.所以说能跨平台,前提是平台上必须要有相匹配的java

DML语言(数据操纵语言)

#DML语言/*数据操作语言:插入:insert修改:update删除:delete */ #一.插入语句#方式一:经典的插入/*语法:insert into 表名(列名,...) values(值1,...); */SELECT * FROM beauty;#1.插入的值的类型要与列的类型一致或兼容INSERT INTO beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id)VALUES(13,'唐艺昕','女','1990-4-23','1

Swift语言指南(一)--语言基础之常量和变量

Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swift 提供了 C 与 Objective-C 中的所有基础类型,包括表示整数的 Int,表示浮点数的 Double 与 Float,表示布尔值的 Bool,以及表示纯文本数据的 String. Swift 还为两个基本集合类型 Array 与 Dictionary 提供了强大的支持,详情可参考 (集合类型)Collection Types. 与 C 语言类

0基础学C语言:C语言视频教程免费分享!

C语言是一种通用的.过程式的编程语言,广泛用于系统与应用软件的开发.作为计算机编程的基础语言,长期以来它一直是编程爱好者追捧而又比较难学的语言.C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点. 很多初学者在学习C语言的时候,如果有适合自己的视频教程,学习起来就会事半功倍.今天在这里给大家分享一个0基础学习C语言的视频教程,需要的朋友可以看看,作为参考! 课程部分截图: 百度云盘下载:http://pan.baidu.com/s/1jIbtWEi 密码:npd9

编译性语言、解释性语言和脚本语言

1.计算机不能直接理解高级语言,只能理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序.(计算机只能执行机器语言:我们要执行高级语言编的代码,就只能用编译器把它变成机器语言) 2.翻译有两种方式:a.编译b.解释.两种方式主要是翻译的时间不同 3.编译语言:编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成机器语言文件:比如,exe文件,以后运行的话就不用重新编译了,直接使用编译的结果就行了:因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序

为什么和其他语言相比C语言是快速的语言

初入门的我们经常听见别人说"真正的程序员用C语言编程,C是最快的语言因为它是最靠近及其底层的语言."那么和其他语言相比C语言到底有什么特别的呢? C语言没有什么特别,这就是它快速的秘诀. 新的语言支持更多的特性,比如,垃圾回收(garbage collection),动态类型(dynamic typing)等等.这些新加入的特性让出学者们更容易上手. 问题的关键就在于,这些新的功能增加了处理开销(processing overhead),也就降低了程序性能.而C语言中没有这些功能,它不

Swift语言指南(八)--语言基础之元组

元组 元组(Tuples)将多个值组合为一个复合值.元组内的值可以是任何类型,各个元素不需要为相同类型(各个元素之间类型独立,互不干扰--Joe.Huang). 下例中,(404, "Not Found") 是一个描述HTTP状态码的元组.HTTP状态码是当你向WEB服务器请求页面时服务器返回的一个特殊值,如果你(向WEB服务器)请求了一个不存在的网页,返回的状态码就是 404 Not Found : 1 let http404Error = (404, "Not Found

动态语言和静态语言、编译型语言和解释型语言、强类型语言和弱类型语言的分析

一.动态语言和静态语言1. 我们常说的动.静态语言,通常是指: 动态类型语言 Dynamically Typed Language 静态类型语言 Statically Typed Language 可能还有:动.静态编程语言 Dynamic\Statically Programming Language 2.    动态类型语言:在运行期间检查数据的类型的语言例如:Ruby\Python这类语言编程,不会给变量指定类型,而是在附值时得到数据类型.Python是动态语言,变量只是对象的引用,变量a

初识GO语言——安装Go语言

本文包括:1)安装Go语言.2)运行第一个Go语言.3)增加vim中对Go语言的高亮支持. 1.安装Go语言 本文采用源码安装Go语言,Go语言的源代码在百度网盘 http://pan.baidu.com/s/1mguZqhM 1.1.修改环境变量 编辑文件~/.bashrc vim ~/.bashre 在文件最后添加如下代码 # about go language export GOROOT=$HOME/go export GOARCH=386 export GOOS=linux export

Swift语言指南(二)--语言基础之注释和分号

注释 通过注释向自己的代码中注入不可执行的文本,作为你自己的笔记或提示.Swift编译器运行时会忽略注释. Swift的注释与C语言极其相似,单行注释以两个反斜线开头: //这是一行注释 多行注释以/*开始,以*/结束: ? 1 2 3 <span style="color: rgb(0, 128, 0);">/* 这也是一条注释, 但跨越多行 */ </span> 与 C 语言的多行注释有所不同的是,Swift 的多行注释可以嵌套在其他多行注释内部.写法是在一