一尘不染

无法在非接口值上键入switch

go

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

无法键入打开非接口值

有人知道这是什么意思吗?

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


阅读 177

收藏
2020-07-02

共1个答案

一尘不染

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

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文档。

2020-07-02