Type-Switch에서도 쓰기도하고, empty interface를 자주 사용되는 부분에서 type assertion은 확실히 이해하고 넘어가야겠다고 생각했다.
결론부터 말하자면, Type Assertion은 interface type의 value의 Type을 확인하는 것이다.
말이 조금 이상할 수 있지만, 아래의 설명과 예시와 함께라면 이해하기에 충분하다🤔
Type Assertion
interface type의 x
와 타입 T를 → x.(T)로 포현했을때,
x
가nil
이 아니며,x
는 T 타입에 속한다는 점을
확인하기(assert)하는 것으로 이러한 표현을 Type assertion 이라고 부른다.
x
가nil
이거나x
의 타입이 T가 아니라면 → Runtime ERRORx
가 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
'LANG > Golang' 카테고리의 다른 글
[Golang][Algo] Python으로 코딩하고 Go로 한번 더 풀기 -2- Trapping Rain Water (0) | 2021.03.22 |
---|---|
[Golang] Sqrt(Newton's Method)와 같이 Go언어 Custom Error처리 이해하기 (0) | 2021.03.16 |
[Golang] cannot type switch on non-interface value v (type int) (0) | 2021.03.15 |