Go 语言:defer 延迟执行


#Go 语言


defer 后的语句/函数,会在当前函数return 后,返回前执行、

示例1

package main

import (
	"fmt"
)

func main() {
	defer fmt.Println("1")
	fmt.Println("2")
}

执行结果:

2
1

示例2

后 defer 的先执行。

package main

import (
	"fmt"
)

func main() {
	defer fmt.Println("1")
	defer fmt.Println("2")
	defer fmt.Println("3")
	defer fmt.Println("4")
}

执行结果:

4
3
2
1

示例3

package main

import (
	"fmt"
)

func main() {
	defer fmt.Println("1")
	defer fmt.Println("2")
	defer func() {
		defer fmt.Println("a")
		defer fmt.Println("b")
	}()
	defer fmt.Println("3")
	defer fmt.Println("4")
}

执行结果:

4
3
b
a
2
1

示例4

如果有命名返回值,defer 可以修改返回值。

package main

import "fmt"

func test() (result int) {  // 返回值命名为 result
	result = 1
	defer func() {
		result += 1
	}()
	return result
}

func main() {
	fmt.Println(test())
}

执行结果:

2

如果不是命名返回值,对于值类型,不会修改:

package main

import "fmt"

func test() int {
	result := 1
	defer func() {
		result += 1
	}()
	return result
}

func main() {
	fmt.Println(test())
}

执行结果:

1

对于指针类型,则会有修改效果:

package main

import "fmt"

func test() *int {
	result := 1
	defer func() {
		result +=1
	}()
	return &result
}

func main() {
	fmt.Println(*test())
}

执行结果:

2

示例5

defer 必须出现在 return 之前,否则不会生效

package main

import "fmt"

func main() {
	defer fmt.Println(1)
	return
	defer fmt.Println(2)
}

执行结果:

1


( 本文完 )