2.1.可变参数函数
- 可变参数指参数的个数可以是任意个
- 可变参数必须在参数列表最后的位置,在参数名和类型之间添加三个点表示可变参数函数
- 声明函数时,在函数体把可变参数当作切片使用即可
package main import "fmt" func demo(name string, hover ... string) { fmt.Println(name,"的爱好是") for i,n := range hover{ fmt.Println(i,n) } } func main() { demo("derek","看书","打球","游戏") } //结果 derek 的爱好是 0 看书 1 打球 2 游戏
2.2.匿名函数
package main import "fmt" func main() { //第一种:无参数无返回值 func(){ fmt.Println("无参数无返回值匿名函数") }() //第二种:有参数 func(name string){ fmt.Println("名字为:",name) }("derek") //第三种:有返回值 name := func() string{ return "zhang_derek" }() fmt.Println(name) }
2.3.函数变量
在go语言中函数也是一种类型
- 定义完函数变量后,可以使用匿名函数进行赋值,也可以使用已经定义好的函数进行赋值
- 函数变量定义以后与普通函数调用语法相同,变量名就是普通函数声明的函数名
- 函数变量是除了slice,map,channel,interface外第五种引用类型
(1)函数变量是引用类型
package main import "fmt" func b() { fmt.Println("bbb") } func main() { //函数变量是引用类型 var a func() a = b //内存地址相同 fmt.Println(a,b) //0x47d820 0x47d820 }
(2)函数作为参数
package main import "fmt" func mydo(arg func(name string)) { fmt.Println("执行mydo") arg("derek") } func main() { mydo(func(name string) { fmt.Println(name) }) }
(3)函数作为返回值
package main import "fmt" //函数作为返回值 func a() func() int{ return func() int { return 110 } } func main() { result := a() r2 := result() fmt.Println(r2) //110 }