정상우
hELLO.
정상우
전체 방문자
384,511
오늘
130
어제
1,174
  • hELLO. (121)
    • 컴퓨터과학 (4)
      • 알고리즘 & 자료구조 (4)
    • 언어 & 프레임워크 (63)
      • Go (23)
      • PHP & Laravel (40)
    • 웹 (7)
    • 블록체인 (12)
      • 메인넷 (9)
      • 암호화폐 플랫폼 (3)
    • 포트폴리오 (10)
    • 칼럼 (20)
      • 에세이 (4)
      • 개발자스럽게 살기 (14)
      • 회고 (2)
    • 티스토리 (5)

블로그 메뉴

  • ⚡ 개발자 이력서
  • 🌟 깃허브
  • 💻 강의
  • ✨ 예제코드
  • ⭐ 브런치
  • 태그 클라우드
  • 방명록

공지사항

  • 2차 도메인을 설정했습니다 ✨

인기 글

  • JWT(JSON Web Token)의 개념부⋯
    2021.07.29
    JWT(JSON Web Token)의 개념부⋯
  • 'REST' 를 보다 'RESTful' 하게⋯
    2021.08.14
    'REST' 를 보다 'RESTful' 하게⋯
  • [Laravel] 라라벨 프레임워크⋯
    2021.06.10
    [Laravel] 라라벨 프레임워크⋯
  • 깃허브를 포트폴리오로 쓰려면⋯
    2021.12.25
    깃허브를 포트폴리오로 쓰려면⋯
  • 암호화폐 트레이딩 봇을 만들었⋯
    2021.05.12
    암호화폐 트레이딩 봇을 만들었⋯

태그

  • php
  • go
  • 블록체인
  • 포트폴리오
  • 개발
  • 라라벨
  • 프로그래머스
  • Algorithm
  • 코딩테스트
  • 개발 리뷰

최근 댓글

  • 고맙습니다 ~^^
    정상우
  • 오늘 블로그 만들었는데 검색하⋯
    엥뿌삐
  • 좋은 스킨 정말 감사드립니다.⋯
    이태홍
  • 고맙습니다 ㅎㅎ
    정상우
  • 제가 원하던 최고의 스킨입니다⋯
    _HEON

최근 글

  • 빠르게 성장하는 개발자의 세⋯
    2022.06.08
    빠르게 성장하는 개발자의 세⋯
  • 개발자와 엔지니어, 그 사이에서
    2022.05.10
    개발자와 엔지니어, 그 사이에서
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.03
    아임포트(Iamport)로 결제기능⋯
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.01
    아임포트(Iamport)로 결제기능⋯
  • [Laravel] 카페24 호스팅에 라⋯
    2022.03.29
    [Laravel] 카페24 호스팅에 라⋯

티스토리

hELLO · Designed By 정상우.
정상우

hELLO.

언어 & 프레임워크/Go

Go: Switch 를 사용하여 타입 체크하기 (Reflection) [Effective Go]

2020. 12. 28. 14:12

Switch

일반적으로 다른 언어에서는 어떤 값의 타입에 따라 다른 행동을 하고 싶을 때 Reflection 를 사용하여 해결한다. Go 에서는 특이하게도 언어차원에서 Switch 를 사용하여 해결할 수 있는데, 다음과 같이 해볼 수 있다.

var t interface{} = map[string]string{
	"sayHello": "Hello, Go!",
}

switch t := t.(type) {
case string:
	fmt.Println(t)
case map[string]string:
	for k, v := range t {
		fmt.Println(k, v)
	}
}

Switch 와 함께 타입 단언(Type Assertion)을 사용하여 해결할 수 있다. 그런데 자세히 살펴보면 map 타입에 대해서는 상당히 불편한 사항을 발견할 수 있는데, 키와 값의 타입이 반드시 지정이 되어 있어야 체크가 가능하다는 점이 바로 그것이다.

reflect 패키지로 타입 체크하기

키와 값에 구분없이 단순히 포인터인 경우, 맵인 경우와 같이 종류만으로만 점검하고 싶다면 reflect 패키지를 사용하면 해결할 수 있다. reflect 패키지를 사용하여 타입을 체크하면 다음과 같이 바꿀 수 있다. 이렇게 바꾸면 맵 타입에 대해 키와 값 타입에 상관없이 체크가 가능하다.

t := map[string]string{
	"sayHello": "Hello, Go!",
}

switch rv := reflect.ValueOf(t); rv.Kind() {
case reflect.String:
	fmt.Println(rv.String())
case reflect.Map:
	for k, v := range t {
		fmt.Println(k, v)
	}
}

reflect.ValueOf() 함수는 reflect.Value 를 반환하는데, 이 타입의 메서드들은 우리가 값으로 넘긴 것에 대한 값 자체에 대한 정보가 담겨있다. 여기서 Value.Kind() 메서드를 쓰면 해당 값의 종류를 알 수 있다. 리턴하는 값은 reflect.Kind 타입을 가진다. Kind 는 Type 과는 다른데, Value.Type().String() 으로 하게 되면 map[string]string 이 나올 것이고, Value.Kind().String() 를 사용하게 되면 map 이 나온다.

    '언어 & 프레임워크/Go' 카테고리의 다른 글
    • Go: recover() 를 사용하여 복구하기 [Effective Go]
    • Go: 웹 서버 구축하기 (net/http, html/template)
    • Go: new vs make [Effective Go]
    • Go: 싱글 바이너리로 웹 서비스 제공하기 (go-bindata)
    go, Reflect, SWITCH, 타입단언, 타입체크
    정상우
    정상우
    과거의 배움으로 현재를 바꾸고 미래를 만듭니다. #25+2살 #INFJ #개발자 #브런치작가
    댓글쓰기
    다음 글
    Go: 웹 서버 구축하기 (net/http, html/template)
    이전 글
    Go: new vs make [Effective Go]
    • 이전
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • ···
    • 23
    • 다음

    티스토리툴바