我可能在这里缺少一些非常简单的东西:

package main

import (
    "fmt"
    "strconv"
    "reflect"
)

func main() {
    s := "abd"
    fmt.Println(s)
    _, err := strconv.Atoi(s)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(reflect.TypeOf(err))

    fmt.Println(err.Err)

}

我正在尝试提取错误本身,例如ErrSyntaxErrRange,但我不能这样做。

看完之后:

https://golang.org/src/strconv/atoi.go?s=3604:3671#L16

我看到errstrconv.NumError的指针
    15  // A NumError records a failed conversion.
    16  type NumError struct {
    17      Func string // the failing function (ParseBool, ParseInt, ParseUint, ParseFloat)
    18      Num  string // the input
    19      Err  error  // the reason the conversion failed (ErrRange, ErrSyntax)
    20  }
Err是保存ErrRangeErrSyntax的字段。因此,我认为err.Err可以工作,但是我得到:
err.Err undefined (type error has no field or method Err
Err是公开的,我是否缺少可见性规则?

我想念什么?

最佳答案

使用type assertion获取*strconv.NumError值:

if e, ok := err.(*strconv.NumError); ok {
    fmt.Println("e.Err", e.Err)
}

playground example

09-07 21:51