函数
函数基础部分
语法:func关键字 函数名(参数1 类型,参数2 类型) (返回值类型){ }。{
}
之间的代码,就是函数体。
1.无参数,无返回值
package main import "fmt" func test() { fmt.Println("xxx") # 表示这个函数不需要输入参数,且没有返回值 }
2.有两个int类型的参数
package main import "fmt" func main() { test(a:1, b:2) # 只需要输入1,2便会自动补全 } func test(a int, b int) { fmt.Println(a + b) }
3.有一个数字类型返回值,一定要指定返回值类型
package main
import "fmt" func main(){ c := test(1,2) fmt.Println(c) } // func test(a,b int) int { // return a+b func test(a,b int) string { return "laji" }
4.返回多个值
package main
import "fmt" func main(){ //a,b := test(1,2) // 有两个返回值 //fmt.Println(a,b) a,_ := test(2,2) // 不要第二个返回值 ,'_'在python中是个变量,在go中表示空 fmt.Println(a) } func test(a,b int) (int, string) { return a+b, "成功" }
5.在go中没有位置参数和关键字参数,都是位置参数,也没有默认参数
package main
import "fmt" func main(){ c := test(2,3) fmt.Println(c) } func test(a,b int) int { return a+b }
6.不定长参数
package main
import "fmt" func main(){ fmt.Println(1,2,3,4,5,6) } func test(a interface{}) { fmt.Println(a) }
函数高级部分
1.内层函数
内层函数:定义在函数内部的函数。go中函数内部定义的函数是不能有名的,需要定义匿名函数:没有名字
package main
import "fmt" func main() { test(1) } func test(a int) { func() { fmt.Println("我是内层函数") }() }
2.闭包函数
定义:在函数内部,对外部作用有引用。
package main
import "fmt" func test(a int) (func()){ b := func() { fmt.Println(a) fmt.Println("我是闭包函数") } return b }
func main() { c := test(3) // 加括号,是为了不直接return返回 b c() }
3.定义一个函数,传入函数,返回函数
package main
import "fmt" func test(a func()) func() { b := func(){ fmt.Println("我先执行") a() fmt.Println("函数执行完") } return b } func test2() { fmt.Println("hello") } func main() { a := test2 a = test(a) a() }
4.给类型命别名
package main
import "fmt" type MyFunc func(a int,b int) func() type MyInt int func test() MyFunc { c:= func(a int,b int) func(){ return func() { } } return c } func main() { var a MyInt = 10 fmt.Println(a) }