16

例如,在这个答案中:

https://stackoverflow.com/a/10385867/20654

...
if exiterr, ok := err.(*exec.ExitError); ok {
...

err.(*exec.ExitError) 那叫什么?它是如何工作的?

4

2 回答 2

18

这是类型断言。我无法比规范更好地解释它。

于 2012-05-02T14:03:53.110 回答
6

这是一个类型断言。该if语句正在检查是否err也是一个*exec.ExitError. 让ok你知道它是不是。最后,exiterris err,但“转换”为*exec.ExitError. 这仅适用于interface类型。

ok如果您 100000% 确定基础类型,您也可以省略。但是,如果你省略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不是语法的一部分。它只是一个布尔值,您可以随意命名。

于 2016-02-22T07:04:11.060 回答