我可能在这里遗漏了一些非常简单的东西:
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
是公开的,我是否遗漏了可见性规则?
我错过了什么?
答案 0 :(得分:4)
使用type assertion获取*strconv.NumError
值:
if e, ok := err.(*strconv.NumError); ok {
fmt.Println("e.Err", e.Err)
}