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) 可以强制转换回结构,但是即使类型不匹配也会成功,那么就可能出现错误的转换...程序就跑飞了。

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


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

5 回复

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


非常感谢。
value.(type) 时光想着 value 是指针,需要取值才能转换为结构,居然忘了 type 也是可以修改的…

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确实持有你想要断言的具体类型或其指针类型的值。

回到顶部