如果我有一个仅使用名称重新定义预定义类型的自定义类型:
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)) }
为什么类型声明失败,但是转换有效?
类型断言仅适用于接口。接口可以具有任意基础类型,因此我们可以进行类型声明和类型转换。类型断言bool作为第二个返回值返回,以指示断言是否成功。
bool
您的自定义类型Answer只能有一种基础类型。您已经知道确切的类型- Answer和基础类型- string。您不需要断言,因为转换为基础类型将始终成功。
Answer
string
只需将您的自定义类型转换为即可string。转换将成功,因为您的自定义类型已string作为基础类型。转换语法:string(ans)。去玩