Go函数的特性
不支持:嵌套、函数重载、默认值参数
支持:可变变参、多返回值、命名返回值参数、匿名函数、闭包
特别注意:函数可以作为一种类型使用
1.1、函数定义
func name(parameter-list)(result-list) {
body
}
1.2可变参数函数
可变参数函数就是指函数的最后一个参数可以接受任意个参数。这类函数在最后一个 参数的类型前面添加有一个省略号"..."。在函数里面这个参数实质上变成了一个对应参数类型的切片。
func Minimumint(first int, rest ...int) int {
for _, x := range rest {
if x < first
first = x
}
return first
}
1.3多返回值函数
Go语言支持一个函数能够返回多个结果。
func findLinks(url string) ([]stning, error) {
//func body
return links, err
}
调用一个多返回值函数,如果调用者要使用这些返回值,则必须显式地将返回值赋给变量。
如:links, err := findLinks(url)
忽略其中一个返回值可以将它赋给一个空标识符。
如:links, _:= findLinks(url) // 忽略错误信息
返回一个多值结果可以是调用另一个多值返回的函数:
func findLinksLog(url string) ([]string, error) {
log.Printf("findLinks %s", url)
return findLinks(url)
}
1.4命名返回值参数
Go语言支持返回参数想入参一样进行命名,命名后的返回参数可用作为函数的局部变量使用,并且可用使用return直接返回。
func f(a, b, c int) (x, y, z int) {
x = a * b
y = b * c
z = c * a
return //不需要指定返回的变量
}
1.5 init()函数和 main()函数
Go语言为特定目的保留了两个函数名:init()函数(可以出现在任何的包里)和main () 函数(只在main包里)。这两个函数既不可接收任何参数,也不返回任何结果。
init ()函数和main ()函数是自动执行的,所以我们不应该显式调用它们。
Go程序的启动顺序
Go程序的初始化和执行总是从main包开始;
如果main包里导入了其他的包,则会按顺序将它们包含进main包里;
一个包实际上只会被导入 —次,当一个 包被导入时,如果它自己还导入了其他的包,则还是先将其他的包导入进来,然后再创建这个 包的一些常量和变量。
后续就是调用init()函数了(如果有多个就调用多次),最终所有的 包都会被导入到main包里(包括这些包所导入的包等),此时main这个包的常量和变量也会 被创建,init()函数会被执行(如果有或者多个的话);
最后,main包里的main()函数会被执行,程序开始运行。
启动过程参考下图:
Go程序启动过程.png
1.6无函数体函数声明
在Go的应用中,有可能会看到有些函数的声明没有函数体,说明该函数使用了Go以外的语言实现,这样的声明定义了函数签名。
func Sin(x float64) float64 //使用汇编语言实现
网友评论