golang은 두가지 타입의 형 변환 방법이 있다.
하나는 변수의 타입을 변환해주기 위한, 즉 형 변환을 위한 type conversion 과 임의의 값을 가지는 interface를 다시 임의의 타입으로 변환하기 위한 type assertion (concrete) 이 존재한다.
두가지 방식의 사용법을 간단히 비교해보면 아래와 같다.
// type conversion
string(val)
int64(n)
float64(b)
//type assertion
val.(string)
n.(int64)
b.(float64)
type conversion 은 우리가 흔히 알고 있는 형 변환(type casting) 연산자와 동일하다. 명시적으로 변수의 타입을 변경하는 것이다.
즉, type conversion은 일반적으로 우리가 알고 있는 type (string, byte, int, uint, float slice, array 등)의 변수를 다른 타입으로 형 변환할 때 사용한다고 생각하면 된다.
type assertion 은 any (or interface)로 정의된 값에 대한 타입을 명시하는 개념이다.
반면에 type assertion은 sync.Map과 같이 interface (any) 로 정의된 value의 타입을 명시하기 위해 주로 사용한다.
이 때 value의 타입은 struct, pointer 타입이 될 수도 있다.
type conversion (casting), type assertion 주의점
일반적으로 type conversion 을 잘못 사용했을 때는 build 단계나, 코딩 시 개발 툴에서 바로 error 확인이 가능하다.
- 잘못된 type conversion 예)
func main() {
val := "hello"
num := uint64(val) //type error 발생
fmt.Println(num)
}
# command-line-arguments
./main.go:18:16: cannot convert val (variable of type string) to type uint64
하지만 type assertion의 경우 잘못된 타입으로 명시하더라도 코딩 툴이나 build 단계에서 전혀 에러가 발생하지 않고, 실행했을 때 runtime error (panic) 가 발생하고 나서야 알 수 있다.
- 에러를 바로 확인하기 어려운 type assertion 예)
func main() {
var val interface{} = "hello"
fmt.Println(val.(uint64)) //runtime error
}
type assertion 시 underlying value만 리턴 받을 수도 있지만 underlying value와 boolean value 두 가지를 리턴 받을 수도 있다.
실행 중 runtime error (panic) 를 만나지 않기 위해서는 type assertion 사용 시 바로 value를 받는 것 보다 아래와 같이 assertion 성공 유무를 같이 받아 처리하는 것이 좋다.
- type assertion 시 underlying value, boolean value를 함께 받아 처리하는 예)
func main() {
var val interface{} = "hello"
if assertVal, ok := val.(uint64); ok {
fmt.Println(assertVal)
} else {
fmt.Println("type assertion error")
}
}
2023.01.16 - [golang (go)] - golang slice or array element(item) remove (delete)
2022.12.04 - [golang (go)] - golang random UUID
'golang (go)' 카테고리의 다른 글
golang - const와 iota로 enum(열거)형 구현하기 (1) | 2023.11.18 |
---|---|
golang byte slice (array) compare (0) | 2023.02.07 |
golang slice or array element(item) remove (delete) (0) | 2023.01.16 |
golang random UUID (0) | 2022.12.04 |
golang download & install (MAC) (0) | 2022.10.10 |
댓글