首页  >  文章  >  后端开发  >  Go 中自定义类型的类型断言和转换有什么区别?

Go 中自定义类型的类型断言和转换有什么区别?

DDD
DDD原创
2024-11-06 10:32:02842浏览

What's the Difference Between Type Assertions and Conversions for Custom Types in Go?

了解 Go 中命名类型断言和转换之间的差异

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn