无法在非接口值上键入开关

时间:2014-04-19 15:59:46

标签: interface go type-conversion

我使用以下虚拟代码玩类型断言,我收到错误:

  

无法在非界面值上键入开关

有谁知道这意味着什么?

package main

import "fmt"
import "strconv"

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}

http://play.golang.org/p/Ti4FG0m1mc

4 个答案:

答案 0 :(得分:25)

我想出了答案,即在类型断言之前将n强制转换为interface{}

switch v := interface{}(n).(type)

答案 1 :(得分:20)

类型开关需要一个内省的界面。如果你传递一个已知类型的值,它就会爆炸。如果您创建一个接受接口作为参数的函数,它将起作用:

func typeSwitch(tst interface{}) {
    switch v := tst.(type) {
        case Stringer:
           fmt.Println("Stringer:", v)
        default:
           fmt.Println("Unknown")
    }
}

请参阅此处的完整代码http://play.golang.org/p/QNyf0eG71_以及有关接口http://golang.org/doc/effective_go.html#interfaces的golang文档。

答案 2 :(得分:1)

类型转换有两种

    基本数据类型之间的
  1. 转换。为此,我们可以使用直接铸造

    i:= 48

    str:=字符串(i)

  2. 但是使用value。(type)进行类型转换是为了在类层次结构之间进行转换(例如,我们要从接口获取特定实现的位置)。否则,我们得到上述错误。

答案 3 :(得分:0)

Go中没有类型转换。您正在进行类型转换。