golang 怎么将接口转换为结构? t2, err := i1.(T1) 提示 invalid type assertion: i1.(T1) (non-interface type *T1 on left)

2015-10-31 13:50:48 +08:00
 gamexg

最近在学习 golang ,碰到了一个问题。
结构指针 可以隐式转换为 接口,但是再通过

t2, err := i1.(T1) 或 t2, err := (*i1).(T1)

转换回结构时就会提示 “ invalid type assertion: i1.(T1) (non-interface type *T1 on left)” 错误,无法编译。请问为什么会出现这个错误?怎么解决?

虽然 T1(i1) 可以强制转换回结构,但是即使类型不匹配也会成功,那么就可能出现错误的转换...程序就跑飞了。

相关代码:
https://gist.github.com/GameXG/8b4e0ded37e8f6843652

1632 次点击
所在节点    Go 编程语言
4 条回复
zhujinliang
2015-10-31 14:12:43 +08:00
i1.(*T1)
注意 T 和*T 是不同的类型
另外你的 i1 现在应该不是 interface{}型,编译器发现了永远无法成立的类型断言,导致报这个错误

手机现在看不了 gist (墙)
gamexg
2015-10-31 14:18:41 +08:00
@zhujinliang 非常感谢。
value.(type) 时光想着 value 是指针,需要取值才能转换为结构,居然忘了 type 也是可以修改的...
zhujinliang
2015-10-31 14:22:56 +08:00
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()
}
dtynn
2015-10-31 14:34:18 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/232499

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX