关于go:go-defer的坑

41次阅读

共计 700 个字符,预计需要花费 2 分钟才能阅读完成。

package main

import (
    "errors"
    "fmt"
    "runtime"
)

func main() {
    var err error
    err = nil
    var i int64
    i = 0
    defer dead(err, i)
    defer dead2(&err, &i)
    defer func() {
        // 闭包,err,i 的值会随着调用函数的语句扭转
        _, _, line, _ := runtime.Caller(0)
        fmt.Printf("%v err:%v  i:%v\n", line, err, i)
    }()
    defer func(err error, i int64) {
    // 尽管是闭包,然而 defer 内函数的值拷贝
        _, _, line, _ := runtime.Caller(0)
        fmt.Printf("%v err:%v  i:%v\n", line, err, i)
    }(err, i)

    i = 5
    err = errors.New("aaa")

    _, _, line, _ := runtime.Caller(0)
    fmt.Printf("%v err:%v  i:%v\n", line, err, i)
}

func dead(err error, i int64) {
// 值传递,defer 申明的时候,error,i 值曾经确定了
    _, _, line, _ := runtime.Caller(0)
    fmt.Printf("%v err:%v  i:%v\n", line, err, i)
}

func dead2(err *error, i *int64) {
// 指针传递,err i 指向的内容,会反映出 defer 执行时的内容。_, _, line, _ := runtime.Caller(0)
    fmt.Printf("%v err:%v  i:%v\n", line, *err, *i)
}

正文完
 0