Go:命名类型断言和转换

时间:2013-09-09 05:25:26

标签: go

如果我有一个自定义类型,只需重新定义一个名为的预定义类型:

type Answer string

我尝试在接受预定义类型的函数中使用它:

func acceptMe(str string) {
    fmt.Println(str)
}

func main() {
    type Answer string
    var ans Answer = "hello"

    // cannot use ans (type Answer) as type string in function argument
    acceptMe(ans)          
    // invalid type assertion: ans.(string) (non-interface type Answer on left)
    acceptMe(ans.(string)) 
    // Does work, but I don't understand why if the previous doesn't:
    acceptMe(string(ans))
}

为什么类型断言失败,但转换有效?

1 个答案:

答案 0 :(得分:22)

类型断言仅适用于接口。接口可以有任意的底层类型,所以我们有类型断言和类型切换到救援。类型断言返回bool作为第二个返回值,以指示断言是否成功。

您的自定义类型Answer只能有一种基础类型。您已经知道确切的类型 - Answer和基础类型 - string。您不需要断言,因为转换为基础类型将始终成功。

旧答案:

只需将自定义类型转换为string即可。由于您的自定义类型具有string作为基础类型,因此转换将成功。转换语法:string(ans)。 Go Play