LANG/Golang

[Golang] cannot type switch on non-interface value v (type int)

  • Type Switch 공부하면서 나온 ERROR이다.

단순히 생각해서 Switch문의 변수의 Type을 확인한다고 생각해서 아래와 같이 간단하게 Test를 진행해보았는데 value v가 Interface Value가 아니라고 한다.

package main

func main() {
    var v int = 10

    switch v.(type) {
    case int:
        println("int")
    case bool:
        println("bool")
    case string:
        println("string")
    default:
        println("unknown")
    }
}

func do(i interface()) {} 는,

-> 빈 인터페이스(empty interface)를 파라미터로하는 함수를 정의한다. 이 함수는 입력받는 Parameter Type에 따라 각각의 연산이 내장되어있다.

 

switch v := i.(type) 에서는,

-> type assertion을 사용하였다. 즉 위의 처음 에러가 생겼던 code에서 non-interface value라고 볼 수 있는 이유는 모든 type을 설명할 수 있는 빈 인터페이스로 변수를 사용하지 않아서 생기는 오류였다. (type assertion은 인터페이스를 대상으로 한다라고 생각하면 이해하기 쉽다.)

 

구글링하다가 Golang offcial docs에서 제공하는 "A tour of Go" 에서 그 해답을 알 수 있었다. 아래의 code에서는 크게 type-switch, empty interface, type-assertion의 사용을 유의깊게 보면 된다!

 

 

type-switch.go

package main

import "fmt"

func do(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("Twice %v is %v\n", v, v*2)
    case string:
        fmt.Printf("%q is %v bytes long\n", v, len(v))
    default:
        fmt.Printf("I don't know about type %T!\n", v)
    }
}

func main() {
    do(21)
    do("hello")
    do(true)
}
// 출력
Twice 21 is 42
"hello" is 5 bytes long
I don't know about type bool!

*추가적으로 main함수에 empty interface를 둘 수 없었다. 이에 대해서는 조금 더 공부해봐야겠다.