不定参数类型函数定义 【args ...type】
package main
import "fmt"
func Func01(a byte, args ...int) {
fmt.Printf("len(arg) is %d
", len(args))
fmt.Printf("a is %c", a)
}
func main() {
Func01('c', 13, 34, 45)
}
//********输出*********
len(arg) is 3
a is c
定义函数类型
package main
import "fmt"
func Add(a, b int) int {
return a + b
}
//定义函数类型
type FuncType func(int, int) int
func main() {
var fTest FuncType
fTest = Add
a := fTest(10, 20)
fmt.Print(a)
}
//********输出*********
30
回调函数
package main
import "fmt"
func Add(a, b int) int {
return a + b
}
func Subtr(a, b int) int {
return a - b
}
type FuncType func(int, int) int
func Calculator(a int, b int, funx FuncType) {
fmt.Printf("a is %d,b is %d
", a, b)
result := funx(a, b)
fmt.Printf("result is %d
", result)
}
func main() {
Calculator(10, 20, Add)
Calculator(20, 10, Subtr)
}
//******输出*********
a is 10,b is 20
result is 30
a is 20,b is 10
result is 10
匿名函数
package main
import "fmt"
func main() {
a := 10
s := "hello"
//定义匿名函数
f1 := func(i, j int) (result int) {
fmt.Printf("a is %d,s is %s", a, s)
result = i + j
return
}
result := f1(10, 20)
fmt.Printf("result is %d
", result)
//定义匿名函数并直接调用
sum := func(n, m int) (sum int) {
sum = n + m
return
}(10, 40)
fmt.Printf("sum is %d
", sum)
}
理解闭包函数的使用
package main
import "fmt"
func Test() func() int {
var x int
return func() int {
x++
return x
}
}
func Test2() int {
var x int
x++
return x
}
func main() {
f1 := Test() //这里f1实际指向的是 func() int{} 函数
fmt.Println(f1()) // 1
fmt.Println(f1()) // 2
fmt.Println(f1()) // 3
f2 := Test2 // f2指向 Test2() int{} 函数
fmt.Println(f2()) // 1
fmt.Println(f2()) // 1
fmt.Println(f2()) // 1
}
defer 延时调用(在函数中return之后执行)
package main
import "fmt"
func main() {
defer fmt.Println("hello")
fmt.Println("world") //先输出 world 后输出 hello
}
-
defer被声明时,参数是实时解析
package main
import "fmt"
func main() {
a := 10
b := 20
defer func(a, b int) {
fmt.Printf("a = %d,b = %d
", a, b)
}(a, b)
a = 100
b = 200
fmt.Printf("a = %d,b = %d
", a, b)
// a = 100,b = 200
// a = 10,b = 20
}
-
defer执行顺序,先进后出
package main
import "fmt"
func main(){
defer fmt.Println("aaaaaa")
defer fmt.Println("bbbbbb")
defer fmt.Println("cccccc")
//先显示 cccccc 再显示 bbbbbb 最后显示 aaaaaa
}
-
defer可以获取有名返回值
package main
import "fmt"
func c() (i int) {
defer func() {
i++
}()
return 1
}
func main() {
fmt.Println(c()) //输出 2
}
//*****分析********
先执行c()函数里面的 return 1 由于定义c函数时定义了返回值的变量名为i,所以这时的i等于1
defer 函数在return之后执行,也就是在 i=1 被赋值之后执行defer的函数,所以结果为 2
package main
import "fmt"
func main() {
fmt.Println(test()) //输出 2
fmt.Println(test1()) //输出 5
}
func test() (result int) {
defer func() {
result++
}()
return 1
}
func test1() (result int) {
t := 5
defer func() {
t = t + 5
}()
return t
}
//*******分析************
test1() 返回 5 是因为函数定义的返回变量是 result 而 defer 函数中使用的变量是 t 而不是 result