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

Interface 无法在非接口值上键入开关,interface,go,type-conversion,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.

我正在使用以下伪代码处理类型断言,结果出现了错误:

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

有人知道那是什么意思吗

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")
    }
}

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

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

请参阅此处的完整代码和有关接口的golang文档。

我找到了答案,即在类型断言之前将
n
转换为
interface{}

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

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

有两种类型转换

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

    i:=48

    str:=字符串(i)

  • 但是使用value.(type)的类型转换用于类层次结构之间的转换(例如,我们希望从接口获取特定实现的位置)。否则,我们将得到上述错误


  • 谢谢,@dehtron5000。我缺少的是在
    类型断言
    之前需要显式转换到
    接口{}
    。这个答案对我帮助很大。我正在用结构类型的开关解决一些更复杂的情况,但这将我推向了wright的方向。谢谢你,伙计。登录只是为了告诉你)这个答案对我帮助很大。我正在用结构类型的开关解决一些更复杂的情况,但这将我推向了wright的方向。谢谢你,伙计。登录只是为了告诉您)但是对已知类型执行类型断言有什么意义呢?@newacct是的,在生产代码中,如果类型已经已知,您当然不会执行类型断言。本练习的重点是理解类型断言。在现实生活中没有理由使用此代码,因为任何非接口变量(即,
    n
    )在源代码中已经有一个无法更改的已知类型。如果它被声明为int,你就知道它是int。我很想知道为什么它有这么多的赞成票?当然,人们正在寻找一个用例,因为某种原因,我有一个指向结构的指针数组,当我操作数组(添加的项)时,当我尝试键入assert时,它就不是一个接口了。转换到接口{}修复了“非接口类型位于左侧”错误。我的案例是使用mapsyes解析yaml文件,因此简短的回答是,如果Go知道输入的类型,则类型转换/断言的输入是错误的。因此,您必须将输入强制转换到接口{}中,以了解如何在外部函数或类似于此处所示的函数中进行转换。