还记得《【2】Sublime配置GO开发环境》的入门例子吗?数组
固然不记得了:) 闭包
这篇文章距离上篇时间过久远了,遥远的我都快忘记了。仍是把截图贴上吧ide
该例子中的func main()表示这是一个名称叫main的方法,而package main表示这个方法在main包内,这两部分的内容就是本节要分享的知识。函数
这么简单?spa
是的,简单而不简约,呵呵,接着往下看!orm
开发一个应用系统,考虑到代码的可读性,每每会把代码拆分到不一样的包,再给包起一个好记的名字,这样一眼就能明白该包的用途,好比math包,这个就是Go语言自己的数学相关包,该包下面有求绝对值的源文件abs.go,还有求正弦的asin.go等......视频
一、那么什么是包?先看个例子:blog
在E:\GO\workspace\pwm\src\util下建立一个common.go源文件,里面填写以下内容element
上面的common.go代码经过“package关键字”指定了它所属的包(common),接下来就是如何使用common.go中的IsEmpty()函数呢?开发
在E:\GO\workspace\pwm\src下建立一个launcher.go源文件,里面填写以下内容
上面的launcher.go经过“import关键字”把包(common)所在的路径(util)导入进来,而后再经过“包名.函数名(common.IsEmpty())”的方式实现调用。
备注:
到这里可能有人疑惑了,怎么会这样呢?平时调用时都是相似以下的方式写的:
import fmt
fmt.Println("import fmt,then use fmt's function to invoke")
解释:之因此能这样写的缘由是“包名”和“路径”使用了相同的名称。这里为了把包表述清楚,故意把“包”和“包所在路径”使用了不一样的名称。
二、函数
函数是由关键字func、函数名、参数列表、返回值、函数体构成,以下:
(1)若是参数列表中类型相同的参数,如上例能够简写为:
func Add(a, b int)(ret int, err error){ return a + b, nil } |
(2)固然调用该函数时,调用者不关心返回值,甚至不会使用返回变量名,因此上例能够再简写为:
func Add(a, b int)(int, error){ return a + b, nil } |
(3)初次使用GO的读者可能对“多返回值”感兴趣,之前使用别的语言时都是费劲心机地想返回多个值,没有想到GO帮着程序猿实现了 :)
三、函数的不定参数
不定参数并非新兴事物,Java6已有该事物。所谓不定参数即不清楚参数个数具体是多少,以例子来讲明:
func Join(a, b string) string { return a + b } |
该函数实现两个入参字符串的链接,因为入参只有两个,因此调用者只须要Join("a", "b")便可。
请接着向下想,若须要把多个字符串链接起来呢?你可能想到是把入参变为字符串数组,以下:
func Join(a []string) string { joinStr := "" for _, element := range a { joinStr += element } return joinStr } |
但这样又带来一个调用问题,即调用者必须先初始化一个数组或者切片再进行调用,以下:
s := []string{"a", "b", "c", "d", "e"} fmt.Println(common.Join(s)) |
若想让调用者不构造数组或者切片,就像通常字符串同样对待入参,此时就涉及到“不定参数”的概念,以下:
func Join(a ...string) string { joinStr := "" for _, element := range a { joinStr += element } return joinStr } |
与上面的写法仅在于入参采用“...string”,调用者就像对待通常字符串,以下:
fmt.Println(common.Join("a", "b", "c", "d", "e")) |
这种不定参数看着比较优雅,同时也存在一个问题:若入参不全是同一种类型呢?好比入参中即有字符串也有×××,此时必须把不定参数放在最后,不然会报相似can only use ... as final argument in list错误
func Join(i int, a ...string) string { fmt.Println("----------------", i) joinStr := "" for _, element := range a { joinStr += element } return joinStr } |
四、结束语
我看过许式伟、云动力关于GO的书,还有无闻的视频,都谈及到闭包的问题,其实闭包概念好久以前JS就在使用,这里不想再谈闭包的问题,由于在程序的编写过程当中我认为一切都是顺其天然的,写过必定代码以后天然就会考虑代码的优雅性,不留意间就使用到了闭包。