The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
gamexg

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

  •  
  •   gamexg · Oct 31, 2015 · 2208 views
    This topic created in 3935 days ago, the information mentioned may be changed or developed.

    最近在学习 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 replies    2015-10-31 14:34:18 +08:00
    zhujinliang
        1
    zhujinliang  
       Oct 31, 2015 via iPhone   ❤️ 1
    i1.(*T1)
    注意 T 和*T 是不同的类型
    另外你的 i1 现在应该不是 interface{}型,编译器发现了永远无法成立的类型断言,导致报这个错误

    手机现在看不了 gist (墙)
    gamexg
        2
    gamexg  
    OP
       Oct 31, 2015   ❤️ 1
    @zhujinliang 非常感谢。
    value.(type) 时光想着 value 是指针,需要取值才能转换为结构,居然忘了 type 也是可以修改的...
    zhujinliang
        3
    zhujinliang  
       Oct 31, 2015   ❤️ 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  
       Oct 31, 2015   ❤️ 1
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2828 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 06:34 · PVG 14:34 · LAX 23:34 · JFK 02:34
    ♥ Do have faith in what you're doing.