./main.go:23:15:无效的类型断言:bar。(Foo)(左边是非接口类型Bar)

时间:2017-11-24 14:57:10

标签: go

我很难理解为什么这段代码无法构建。

package main

import (
    "fmt"
)

type Foo interface {
    Cose() string
}

type Bar struct {
    cose string
}

func (b *Bar) Cose() string {
    return b.cose
}

func main() {
    bar := Bar{
        cose: "ciaone",
    }
    ii, ok := bar.(Foo)
    if !ok {
        panic("Maronn")
    }
    fmt.Println(" cose : " + ii.Cose())
}

2 个答案:

答案 0 :(得分:2)

接口是一种相反的操作 - 将接口转换为特定类型。像:

package main

import (
    "fmt"
)

type Foo interface {
    Cose() string
}

type Bar struct {
    cose string
}

func (b *Bar) Cose() string {
    return b.cose
}

func main() {
    bar := Foo(&Bar{
        cose: "ciaone",
    })
    ii, ok := bar.(*Bar)
    if !ok {
        panic("Maronn")
    }
    fmt.Println(" cose : " + ii.Cose())
}

演示:https://play.golang.org/p/ba7fnG9Rjn

答案 1 :(得分:1)

根据断言的类型断言,通过闭包进行操作:

package main

import (
    "fmt"
)

type Foo interface {
    Cose() string
}

type Bar struct {
    cose string
}

func (b *Bar) Cose() string {
    return b.cose
}

func main() {
    bar := &Bar{
        cose: "ciaone",
    }

    ii := func(bar interface{}) Foo {
        ii, ok := bar.(Foo)
        if !ok {
            panic("Maronn")
        }
        return ii
    } (bar)

    fmt.Println(" cose : " + ii.Cose()  )
}