函数
函数声明
函数的声明方式
func 函数名(形参变量 数据类型,...) (返回值 返回值类型) {
// 函数体
}
Go语言函数的声明跟C语言类似,只不过函数用func
关键字声明,Go语言支持多重返回值,
实例如下,
func Add(a int, b int) (ret int, err error) {
return a + b , nil
}
如果参数列表中若干个相邻的参数类型相同,可以省略前面的变量类型。
func Add(a, b int) (ret int, err error) {
return a + b, nil
}
如果返回值列表中多个返回值的类型相同,也可以同样方式合并
func Add(a, b int) int {
return a + b, a * b
}
函数调用
调用当前文件(或者本包内)的函数
ret := Add(12, 23)
调用其他包内函数
import "myMath" // 先去导入对应的包
ret := myMath.Add(12, 23)
注意,Go语言函数名字的大小写,提现了该函数的可见性。
Go语言可见性规则:小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用,同样适用于变量和类型的可见性。
不定参数
不定参数是指函数传入的参数个数为不定数量。
实例如下,
func Add(args ...int) {
fmt.Println(args)
}
Add(1, 2, 3) // [1, 2, 3]
Go语言中采用...type
语法糖来作为函数的不定参数,并且必须是最后一个参数。但不定参数本质上是一个数组切片(slice),也就是[]type
。
不定参数的传递
func Add(args ...int) {
myFunc(args...) // 原样传递
myFunc(args[1:]...) // 传递片段
}
任意类型的不定参数
如果传递任意类型,可以指定类型为interface{}
。
// 标准库里面fmt.Printf()函数原型
func Printf(format string, args ...interface{}) {
// 函数体
}
多返回值
Go语言又一大特性就是多返回值,这个特性能使我们写出比其他语言更优雅、更简洁的代码。
func Add(a, b int) (int, error) {
return a + b, nil
}
result, err := Add(1, 3)
函数的返回值被命名之后,它们的值在函数开始的时候会被自动初始化为空,在函数中执行不带任何参数的return
语句时,会返回对应的返回值变量的值。
func Add(a, b int) (ret int, err error) {
ret = a + b
err = nil
return
}
result, err := Add(1, 3)
result, _ := Add(1, 4) // 如果调用方法具有多返回值,可以使用`_`跳过(或忽略)这个返回值
匿名函数
在Go语言里面,函数可以像普通变量一样被传递或使用,匿名函数可以直接赋值给一个变量。
Add := func(a, b int) int {
return a + b
}
result := Add(1, 5)
匿名函数可以直接执行。
func(x int) {
fmt.Println(x)
}(1) // 花括号后直接跟参数列表表示函数调用