문제

I am playing with type assertion using the following dummy code, and I got the error:

cannot type switch on non-interface value

Does anyone know what does that mean?

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

도움이 되었습니까?

해결책 2

Type switches require an interface to introspect. If you are passing a value of known type to it it bombs out. If you make a function that accepts an interface as a parameter, it will work:

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

See the full code here http://play.golang.org/p/QNyf0eG71_ and the golang documentation on interfaces http://golang.org/doc/effective_go.html#interfaces.

다른 팁

I figured out the answer, which is to cast n to interface{} before the type assertion:

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

There are two kinds of type conversions

  1. conversion between basic data types. For this we can use the direct casting

    i := 48

    str := string(i)

  2. But type conversion using value.(type) is for conversion among the class hierarchy, (e.g. where we want to get the specific implementation from the interface). Else, we get the above error.

There are no typecasts in Go. You are doing a type conversion.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top