본문 바로가기
golang (go)

golang type conversion [string(val)], type assertion [val.(string)]

by first author 2023. 2. 3.
728x90
반응형

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)

 

golang slice or array element(item) remove (delete)

golang에의 List 타입으로는 가변 길이를 지원하는 slice가 존재한다. java의 경우 list 에서 index remove(), object remove()를 제공하지만 golang의 slice에서는 애석하게도 remove()를 직접 구현해주어야 한다. 가

takeanoteof.tistory.com

2022.12.04 - [golang (go)] - golang random UUID

 

golang random UUID

golang 기본 함수에서는 UUID 관련 패키지를 제공하지 않습니다. 하지만 다행이도 google에서 golang용 uuid 패키지(https://github.com/google/uuid)를 github를 통해 제공하고 있네요. 이쯤이면 golang 기본 함수로

takeanoteof.tistory.com

 

728x90
반응형

댓글