在 Go 中使用自定义类型时,了解命名类型断言和转换之间的细微差别至关重要。让我们通过一个示例来探讨这个概念。
考虑下面的代码片段,其中我们定义了一个自定义类型 Answer,它重新定义了预定义的字符串类型:
<code class="go">type Answer string</code>
然后我们尝试在需要字符串类型的函数:
<code class="go">func acceptMe(str string) { fmt.Println(str) } func main() { type Answer string var ans Answer = "hello" // Assertion fails: cannot use ans (type Answer) as type string in function argument acceptMe(ans) // Type assertion fails as well: invalid type assertion: ans.(string) (non-interface type Answer on left) acceptMe(ans.(string)) // Conversion succeeds. acceptMe(string(ans)) }</code>
类型断言仅适用于接口。接口允许底层类型发生变化。为了确定实际类型,Go 使用类型断言 (x.(T)) 或类型开关 (switch x := x.(type))。断言返回一个布尔值,指示断言是否成功。
在我们的例子中,Answer 是一个具有固定基础类型(字符串)的命名类型。由于底层类型是已知的,因此不需要断言。使用 string(ans) 将 Answer 类型转换为字符串就足够了。
以上是Go 中自定义类型的类型断言和转换有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!