我可能在这里缺少一些非常简单的东西:
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)
}
我正在尝试提取错误本身,例如
ErrSyntax
或ErrRange
,但我不能这样做。看完之后:
https://golang.org/src/strconv/atoi.go?s=3604:3671#L16
我看到
err
是strconv.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
是保存ErrRange
的ErrSyntax
的字段。因此,我认为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