서론
Go 언어에서 interface{} 타입은 모든 타입을 담을 수 있어 매우 유연하게 사용 되는 타입이다. 주로 다양한 데이터 타입을 처리하거나 동적 데이터를 다룰 때 사용된다. 그러나 interface{} 타입으로 처리하다가 원래의 타입으로 변환할 때 잘못된 타입으로 변환을 시도하면 panic이 발생할 수 있다. 이 글에서는 interface{} 타입을 사용할 때 panic을 방지하고 안전하게 타입을 변환하는 방법을 다룬다.
잘못된 단언
var gpa interface{} = 4.5
// panic: interface conversion: interface {} is float64, not string
msg := "GPA: " + gpa.(string)
fmt.Println(msg)
GPA는 float64 타입이지만 string으로 변환하려고 시도하면서 panic이 발생한다.
안전한 형 변환
var gpa interface{} = 4.5
grade, ok := gpa.(string)
if !ok {
score, _ := gpa.(float64)
if score >= 4.5 {
grade = "A+"
} else if score >= 4.0 {
grade = "A"
} else if score >= 3.5 {
grade = "B+"
} else if score >= 3.0 {
grade = "B"
} else if score >= 2.5 {
grade = "C+"
} else if score >= 2.0 {
grade = "C"
} else if score >= 1.5 {
grade = "D+"
} else if score >= 1.0 {
grade = "D"
} else {
grade = "F"
}
}
fmt.Println("Grade:", grade)
interface{} 타입을 다른 타입으로 변환할 때 안전하게 처리하는 방법은 두 번째 반환 변수와 함께 타입 단언을 사용하는 것이다. 이를 통해 타입 단언이 성공했는지를 확인할 수 있는 bool 타입 변수로 panic을 방지할 수 있다. 이 예제에서는 gpa 값을 string 타입으로 변환하려고 시도했지만 gpa가 실제로는 float64 타입이기 때문에 변환이 실패하고 float64로 변환하여 학점을 계산하고 있다. ok 변수로 타입 변환의 성공 여부를 확인할 수 있기 때문에 잘못된 타입으로 변환을 시도하는 경우를 안전하게 처리할 수 있다.
'Language > Go' 카테고리의 다른 글
[golang] fasthttp! 속도를 뒤집어 놓으셨다 (1) | 2024.11.26 |
---|---|
[golang] 타입 스위치(type switch)로 interface{} 값 처리하기 (0) | 2024.11.25 |
[golang] Base64 인코딩과 디코딩 처리하기 (0) | 2024.11.23 |
[golang] 런타임에 콜 스택 출력하기 (1) | 2024.11.22 |
[golang] panic과 recover로 try-catch 따라 하기 (1) | 2024.11.21 |