函数是基本的代码块,用于执行一个任务。
Go 语言至少有一个入口main() 函数。
函数定义的格式如下:
func function_name( [parameter list] ) [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 }
调用函数,(如果需要参数)向函数传递参数,(如果有返回值)并得到返回值,例如:
func main() { ret := max(10,20) // 调用函数,得到返回值 fmt.Println(ret) }
得到输出:b比a大\n20
调用函数,可以通过两种方式来传递参数:值传递和引用传递。
默认情况下,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) }
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) }
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