一、可变参数函数
1、简介
- 可变参数指调用参数时,参数的个数可以是任意个
- 可变参数必须在参数列表的最后的位置,在参数名和类型之间添加三个点表示可变参数函数
func 函数(参数,参数,名称 ... 类型) {
//函数体
}
- 输出语句就是可变参数函数,源码如下
func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
}
- 声明函数时,在函数体把可变参数当作切片使用即可
2、示例
- 可变参数声明与调用
func main() {
demo("aaa", "bbb", "ccc")
}
func demo(hover ... string) {
for a, b := range hover {
fmt.Println(a, b)
/*输出:
0 aaa
1 bbb
2 ccc
*/
}
}
- 可变参数必须存在其它参数后面,一个函数不能有多个可变参数
因为前面普通参数个数是确定的,编译器知道,哪个实参给哪个形参
func main() {
demo("张三", "看书", "写代码", "打篮球")
}
func demo(name string, hover ... string) {
fmt.Println(name, "的爱好是" )
for a, b := range hover {
fmt.Println(a, b)
/*输出:
张三 的爱好是
0 看书
1 写代码
2 打篮球
*/
}
}
二、匿名函数
- 匿名函数就是没有名称的函数
- 正常函数可以通过名称多次调用,而匿名函数由于没有函数名,所以大部分情况都是在当前位置声明并立即调用(函数变量除外)
func () {
}() //括号表示调用
- 匿名函数都是声明在其它函数内部
- 无参数匿名函数
func main() {
func () {
fmt.Println("这是匿名函数")
}()//括号表示调用
}
- 有参数匿名函数
func main() {
func (s string) {
fmt.Println(s,"这是传递的参数") //传递参数 这是传递的参数
}("传递参数")//括号表示调用
}
- 有返回值的匿名函数
func main() {
//有返回值的匿名函数
name := func() string{
fmt.Println("有返回值的匿名函数") //有返回值的匿名函数
return "佳明哥"
}()//此处有调用
fmt.Println(name) //佳明哥
}
三、函数变量
1、函数作为变量
- 在Go语言中函数也是一种类型,函数有多少种形式,函数变量就有多少种写法
func main() {
var a func() //无参数返回值
var b func(int) //有一个int类型参数
var c func(int) string //有一个int类型参数和string类型返回值
fmt.Println(a, b, c) //输出:<nil> <nil> <nil>
}
- 定义完函数变量后,可以使用匿名函数进行赋值,也可以使用已经定义好的函数进行赋值
- 函数变量定义以后与普通函数调用语法相同,变量名就是普通函数声明的函数名
func main() {
var a func()
a = func() {
fmt.Println("执行函数")
} //注意此处没有括号,变量a就表示接收函数返回值
a() //调用函数
/*
也可以使用短变量方式定义函数变量
等效于
func b(s string) {
//...
}
*/
b := func(s string) {
fmt.Println("执行第二个函数")
}
b("参数")
//使用定义好的函数
d := c
d() //输出:c函数
//函数名称也是一个变量
c() //输出:c函数
}
func c() {
fmt.Println("c函数")
}
- 函数类型变量是除了slice、map、channel、interface外第五种引用类型
func main() {
var a func()
a = b
a()
var c func()
c = a
c()
fmt.Printf("%p %p", a, c) //输出地址相同:0x9d73c0 0x9d73c0
}
func b() {
fmt.Println("b")
}
2、函数作为参数或者返回值
- 变量可以作为函数的参数或返回值类型,而函数既然可以当作变量看待,函数变量也可以当作函数的参数或返回值
- 函数作为参数时,类型写成对应的类型即可
func main() {
a(
func(s string) {
fmt.Println(s)
}
)
}
func a(b func(s string)) {
fmt.Println("a执行")
b("传递给s的内容")
}
- 函数作为返回值
func main() {
//此时result指向返回值函数
result := a()
//调用函数,才能获取结果
fmt.Println(result())
}
func a() func() int {
return func() int {
return 110
}
}