函数function
- Go函数不支持 嵌套, 重载和默认参数
支持以下特性:
无须声明原型,不定长度长度变参,多返回值,命名返回值参数,匿名函数,闭包
定义函数使用关键字func,且左侧大括号不能另起一行
package main import ( "fmt" ) func main() { a, b := 1, 2 D(a, b) //传递可变长度变量,无法修改slice索引,无法根本改变slice值 s1 := []int{1, 2, 3} D1(s1) //传递slice作为参数,修改索引值可以达到修改原始slice的效果 x := 1 D2(&x) //传递x的内存地址 } //参数返回值 func A(a int, b string) int { return a } //多个返回值 func B() (a, b, c int) { //没有参数, a, b, c = 1, 2, 3 //因为返回值中已经有a,b,c占用了内层,所以后面直接赋值 return a, b, c //可以省略a,b,c } //不定长变参,即int参数可以是多个,传进来的是个slice类型 func C(b string, a ...int) { fmt.Println(a) //输出 [1,2,3,4,5] } /不定长参数传递,传入变量 func D(s ...int) { fmt.Println(s) s[0] = 3 s[1] = 4 fmt.Println(s) } //传递slice作为参数,拷贝的是slice的内存地址 func D1(s []int) { s[0] = 4 s[1] = 5 fmt.Println(s) } //指针类型传递,可以达到修改变量值的目的 func D2(a *int) { *a = 2 //内存a的值变为2 fmt.Println(*a) } /*输出 D----> [1 2] //slice [3 4] //slice 1 2 //int D1----> [4 5 3] D2----> 2 //参数为指针可以修改变量值 */
函数也可以作为一种类型使用
package main import "fmt" func main() { a := A //函数作为类型使用 a() } func A() { fmt.Println("Func A") } //指针类型传递,可以达到修改变量值的目的 /*输出 a()----> Func A */
函数名可以理解为内存地址的编号,可以被用来赋值操作。
匿名函数,不同与
python
语言有关键字lamada
,go的匿名函数显的更直白,没有函数名,只需要func关键字就可以
简单构建一个匿名函数,如下// 匿名函数 package main import "fmt" func main() { a := func() { //没有函数名,直接进行赋值给变量 fmt.Println("Func A") } a() //调用匿名函数 }
函数的闭包:又称嵌套函数,返回的类型是一个函数,再将函数赋值给变量,重新传入参数执行
package main import "fmt" func main() { f := closure(10) fmt.Println(f(3)) fmt.Println(f(4)) } func closure(x int) func(int) int { // 函数作为返回类型 return func(y int) int { return x + y } } /*输出 f(3)---> 13 f(4)---> 14 */
有疑问加站长微信联系(非本文作者)