Go 中的命名类型断言和转换
在 Go 中,命名类型断言和转换允许开发人员操作自定义和预定义的数据类型。但是,在处理重新定义预定义类型的自定义类型时,可能会出现误解。让我们详细探讨这个问题。
考虑以下代码示例:
<code class="go">type Answer string func acceptMe(str string) { fmt.Println(str) } func main() { type Answer string var ans Answer = "hello" // Illegal usage acceptMe(ans) // Failed type assertion acceptMe(ans.(string)) // Works (but why?) acceptMe(string(ans)) }</code>
问:为什么类型断言 (ans.(string)) 失败,而转换(string(ans)) 有效吗?
A: 类型断言仅适用于接口类型,它表示值可以满足的契约。由于像 Answer 这样的自定义类型不是接口,因此尝试使用类型断言语法来断言它们将导致错误。
相反,转换显式地将一种类型转换为另一种类型。转换 (string(ans)) 成功,因为 Answer 具有基础字符串类型。 Go 会在将 Ans 传递给 AcceptMe 之前将其隐式转换为其底层字符串。
附加说明:
以上是为什么 Go 中自定义类型类型断言失败,但转换成功?的详细内容。更多信息请关注PHP中文网其他相关文章!