[golang] panic 없이 interface{} 타입 변환하기

2024. 11. 24. 17:30·Language/Go

서론

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
'Language/Go' 카테고리의 다른 글
  • [golang] fasthttp! 속도를 뒤집어 놓으셨다
  • [golang] 타입 스위치(type switch)로 interface{} 값 처리하기
  • [golang] Base64 인코딩과 디코딩 처리하기
  • [golang] 런타임에 콜 스택 출력하기
在晟
在晟
  • 在晟
    Jae-Sung
    在晟
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • Language (23)
        • Go (23)
      • DBMS (1)
        • MariaDB (1)
      • Notes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Jae-Sung
    • GitHub
  • 인기 글

  • 태그

    filepath
    http
    Runtime
    fasthttp
    오블완
    티스토리챌린지
    unsafe
    interface{}
    recover
    go
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
在晟
[golang] panic 없이 interface{} 타입 변환하기
상단으로

티스토리툴바