我有一个关于golang延迟的问题:golang延迟语句是在return语句之前还是之后执行?

我已经阅读Defer_statements。但是我没有答案。

我做了一个简单的测试:

func test1() (x int) {
    defer fmt.Printf("in defer: x = %d\n", x)

    x = 7
    return 9
}

func test2() (x int) {
    defer func() {
        fmt.Printf("in defer: x = %d\n", x)
    }()

    x = 7
    return 9
}

func test3() (x int) {
    x = 7
    defer fmt.Printf("in defer: x = %d\n", x)
    return 9
}

func main() {
    fmt.Println("test1")
    fmt.Printf("in main: x = %d\n", test1())
    fmt.Println("test2")
    fmt.Printf("in main: x = %d\n", test2())
    fmt.Println("test3")
    fmt.Printf("in main: x = %d\n", test3())
}
test1()Printftest2()test3()Printfx = 7

但是结果是:

test1
in defer: x = 0
in main: x = 9
test2
in defer: x = 9
in main: x = 9
test3
in defer: x = 7
in main: x = 9

那么,有谁能解释:1.为什么得到这个结果?为什么test1打印0,test2打印9,test3打印7。2.延迟语句在返回之后还是返回之前执行?

非常感谢。