V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
gamexg
V2EX  ›  Go 编程语言

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

  •  
  •   gamexg · 2015-10-31 13:50:48 +08:00 · 1672 次点击
    这是一个创建于 3305 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习 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

    4 条回复    2015-10-31 14:34:18 +08:00
    zhujinliang
        1
    zhujinliang  
       2015-10-31 14:12:43 +08:00 via iPhone   ❤️ 1
    i1.(*T1)
    注意 T 和*T 是不同的类型
    另外你的 i1 现在应该不是 interface{}型,编译器发现了永远无法成立的类型断言,导致报这个错误

    手机现在看不了 gist (墙)
    gamexg
        2
    gamexg  
    OP
       2015-10-31 14:18:41 +08:00   ❤️ 1
    @zhujinliang 非常感谢。
    value.(type) 时光想着 value 是指针,需要取值才能转换为结构,居然忘了 type 也是可以修改的...
    zhujinliang
        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()
    }
    dtynn
        4
    dtynn  
       2015-10-31 14:34:18 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2954 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 12:39 · PVG 20:39 · LAX 04:39 · JFK 07:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.