最近在学习 golang ,碰到了一个问题。
结构指针 可以隐式转换为 接口,但是再通过
t2, err := i1.(T1) 或 t2, err := (*i1).(T1)
转换回结构时就会提示 “ invalid type assertion: i1.(T1) (non-interface type *T1 on left)” 错误,无法编译。请问为什么会出现这个错误?怎么解决?
虽然 T1(i1) 可以强制转换回结构,但是即使类型不匹配也会成功,那么就可能出现错误的转换...程序就跑飞了。
1
zhujinliang 2015-10-31 14:12:43 +08:00 via iPhone 1
i1.(*T1)
注意 T 和*T 是不同的类型 另外你的 i1 现在应该不是 interface{}型,编译器发现了永远无法成立的类型断言,导致报这个错误 手机现在看不了 gist (墙) |
2
gamexg OP @zhujinliang 非常感谢。
value.(type) 时光想着 value 是指针,需要取值才能转换为结构,居然忘了 type 也是可以修改的... |
3
zhujinliang 2015-10-31 14:22:56 +08:00 1
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() } |
4
dtynn 2015-10-31 14:34:18 +08:00 1
|