Golang Go语言 中怎么将接口转换为结构?t2, err := i1.(T1) 提示 invalid type assertion: i1.(T1) (non-interface type *T1 on left)
最近在学习 golang ,碰到了一个问题。
结构指针 可以隐式转换为 接口,但是再通过
t2, err := i1.(T1) 或 t2, err := (*i1).(T1)
转换回结构时就会提示 “ invalid type assertion: i1.(T1) (non-interface type *T1 on left)” 错误,无法编译。请问为什么会出现这个错误?怎么解决?
虽然 T1(i1) 可以强制转换回结构,但是即使类型不匹配也会成功,那么就可能出现错误的转换...程序就跑飞了。
Golang Go语言 中怎么将接口转换为结构?t2, err := i1.(T1) 提示 invalid type assertion: i1.(T1) (non-interface type *T1 on left)
更多关于Golang Go语言 中怎么将接口转换为结构?t2, err := i1.(T1) 提示 invalid type assertion: i1.(T1) (non-interface type *T1 on left)的实战教程也可以访问 https://www.itying.com/category-94-b0.html
i1.(T1)
注意 T 和T 是不同的类型
另外你的 i1 现在应该不是 interface{}型,编译器发现了永远无法成立的类型断言,导致报这个错误
手机现在看不了 gist (墙)
更多关于Golang Go语言 中怎么将接口转换为结构?t2, err := i1.(T1) 提示 invalid type assertion: i1.(T1) (non-interface type *T1 on left)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
gist 刷出来了。。。
主要问题还是, i1 现在不是 interface{}型
刚才说的有点问题,不是编译器发现无法成立的断言,而是断言只能用于 interface 型
另外还有一个错误
断言返回的参数第二个不是 error ,是 bool
func main() {
t1 := T1(123)
var i1 interface{}
i1 = &t1
t2, ok := i1.(T1) // 注意T1
fmt.Println(ok)
t2.F1()
}
在Go语言中,类型断言(type assertion)用于将一个接口类型转换为具体的类型。当你遇到错误提示“invalid type assertion: i1.(T1) (non-interface type *T1 on left)”时,这通常意味着你试图将一个接口类型的值断言为一个非接口类型(这里是*T1
,即T1
的指针类型),这是不允许的。
正确的做法应该是将接口类型断言为具体类型(如果接口持有的是该类型的值),或者断言为具体类型的指针(如果接口持有的是该类型指针的值)。以下是如何正确进行类型断言的示例:
假设有一个接口i
,它可能持有一个T1
类型的值或一个*T1
类型的指针:
var i interface{}
// 假设i被赋值为*T1类型的实例
i = &T1{}
// 如果i是*T1类型
t2, ok := i.(*T1)
if ok {
// t2现在是*T1类型,安全使用
} else {
// 类型断言失败,处理错误
}
// 如果i是T1类型(而不是指针),你需要这样断言:
// 注意:这要求i确实持有T1类型的值,而不是*T1
t3, ok := i.(T1)
if ok {
// t3现在是T1类型,安全使用
} else {
// 类型断言失败,处理错误
}
确保在进行类型断言时,接口类型i
确实持有你想要断言的具体类型或其指针类型的值。