函数
七、函数
函数是基本的代码块,用于执行一个任务。
Go 语言至少有一个入口main() 函数。
1 函数定义
函数定义的格式如下:
func function_name( [parameter list] ) [return_types] {
函数体
} // 函数的作用范围就在大括号之间{}
函数定义解析:
- func:函数由 func 开始声明
- function_name:函数名称,参数列表和返回值类型构成了函数签名。
- parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。声明一个参数的语法采用 参数名 参数类型 的方式,多个参数的声明用逗号隔开。
- return_types:返回类型,规定了函数的返回值类型return_types。有些功能不需要返回值,这种情况下 return_types 不是必须的。
- 函数体:函数定义的代码集合。
举例:
// 定义一个函数
func max(a,b int) int { //如果有连续若干个参数,它们的类型一致,那么我们无须一一罗列,只需在最后一个参数后添加该类型。
ret := a
if a>b{
fmt.Println("a比b大")
}else if a==b {
fmt.Println("a等于b")
}else {
fmt.Println("b比a大")
ret = b
}
return ret
}
2 函数调用
调用函数,(如果需要参数)向函数传递参数,(如果有返回值)并得到返回值,例如:
func main() {
ret := max(10,20) // 调用函数,得到返回值
fmt.Println(ret)
}
得到输出:b比a大\n20
3 其它
调用函数,可以通过两种方式来传递参数:值传递和引用传递。
默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。
Go 语言支持一个函数可以有多个返回值。如果一个函数有多个返回值,那么这些返回值必须用括号括起来。
func swap(x, y string) (string, string) { //这些返回值必须用括号括起来
return y, x
}
func main() {
a, b := swap("Google", "baidu")
fmt.Println(a, b)
}
还可以在定义的时候命名返回值,从函数中可以返回一个命名值。
func rectProps(length, width float64)(area, perimeter float64) {
area = length * width
perimeter = (length + width) * 2
return // 不需要明确指定返回值,默认返回 area, perimeter 的值
}
/*请注意, 函数中的 return 语句没有显式返回任何值。由于 area 和 perimeter 在函数声明中指定为返回值, 因此当遇到 return 语句时, 它们将自动从函数返回。*/
下划线_
在 Go 中被用作空白符,可以用作表示任何类型的任何值。
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, _ := swap("Google", "baidu") // 空白符_ 用来跳过不想要的返回结果
fmt.Println(a)
}
4 函数作为另外一个函数的实参
Go 语言可以很灵活的创建函数,并作为另外一个函数的实参。
func square(a int) int {
return a*a
}
func swap(a,b int) (int,int){
return b,a
}
func main() {
reta,retb := swap(20,square(5))
fmt.Println(reta,retb)
}
5 闭包和匿名函数
Go 语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
func main(){
/* nextNumber 为一个函数,函数 i 为 0 */
nextNumber := getSequence()
/* 调用 nextNumber 函数,i 变量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* 创建新的函数 nextNumber1,并查看结果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}
以上代码执行结果为:
1
2
3
1
2
本文来自博客园,作者:yyyz,转载请注明原文链接:https://www.cnblogs.com/yyyzyyyz/p/15441167.html