例如,在这个答案中:
https://stackoverflow.com/a/10385867/20654
...
if exiterr, ok := err.(*exec.ExitError); ok {
...
那叫err.(*exec.ExitError)
是什么?它是如何工作的?
答案 0 :(得分:12)
这是类型断言。我无法解释它比the spec更好。
答案 1 :(得分:2)
这是一种类型断言。 if
语句正在检查err
是否也是*exec.ExitError
。 ok
让你知道它是否存在。最后,exiterr
为err
,但“已转换”为*exec.ExitError
。这仅适用于interface
类型。
如果你对基础类型有100000%的肯定,你也可以省略ok
。但是,如果你省略ok
并且结果证明你错了,那么你将获得panic
。
// find out at runtime if this is true by checking second value
exitErr, isExitError := err.(*exec.ExitError)
// will panic if err is not *exec.ExitError
exitErr := err.(*exec.ExitError)
顺便说一句,ok
不是语法的一部分。它只是一个布尔值,你可以随心所欲地命名它。