LANG/Golang

[Golang] 헷갈리는 Type assertion 이해하기

Type-Switch에서도 쓰기도하고, empty interface를 자주 사용되는 부분에서 type assertion은 확실히 이해하고 넘어가야겠다고 생각했다.

 

결론부터 말하자면, Type Assertion은  interface type의 value의 Type을 확인하는 것이다.

 

말이 조금 이상할 수 있지만, 아래의 설명과 예시와 함께라면 이해하기에 충분하다🤔

 

 

Type Assertion

interface type의 x 와 타입 T를 → x.(T)로 포현했을때,

  • xnil 이 아니며,
  • x는 T 타입에 속한다는 점을

확인하기(assert)하는 것으로 이러한 표현을 Type assertion 이라고 부른다.

  • xnil 이거나 x의 타입이 T가 아니라면 → Runtime ERROR
  • x 가 T 타입인 경우 → T 타입의 x를 리턴한다.
package main

func main() {
    var a interface{} = 1

    i := a       // a와 i는 dynamic type이고 값은 1
    j := a.(int) // j는 int 타입이고, 값은 1

    println(i) // 포인터 주소 출력
    println(j) // 1 출력
}
  • 여기서 value a를 담은 i를 출력했을 때 포인터 주소가 출력되는게 신기했다. 즉, interface value의 직접적인 값을 얻기 위해서는 type assertion를 반드시 사용해야한다.

 

A tour of Go

package main

import "fmt"

func main() {
    var i interface{} = "hello"

    s := i.(string)
    fmt.Println(s)

    s, ok := i.(string)
    fmt.Println(s, ok)

    f, ok := i.(float64)
    fmt.Println(f, ok)

    f = i.(float64) // panic
    fmt.Println(f)
}
hello
hello true
0 false
panic: interface conversion: interface {} is string, not float64
  • i 는 string type이지 float64가 아니기 때문에 값을 얻을려면 Runtime ERROR 발생

 

Ref