golang에서는 빈 인터페이스를 통해서 여러가지 타입을 받을 수 있습니다. 바로 예시로 넘어가서 확인해보겠습니다.
myPrint 함수의 인자를 보면 타입명이 interface{} 입니다. 빈 인터페이스를 나타내는 것으로 모든 타입을 받을 수 있습니다.
원리를 간단하게 살펴보겠습니다.
위 코드처럼 선언하게 되면 run()이란 함수를 가진 구조체 타입들만 해당함수의 인자로 들어올 수 있습니다.
그런데 이러한 조건없이 empty interface로 선언하면 아무조건이 없으므로 모든 타입을 받을 수 있게 됩니다.
이번에는 인터페이스의 형변환에 대해 알아보겠습니다.
a는 empty interface type으로 b는 int형으로 선언후 더하기 연산을 해보았습니다.
그러나 위에 빨간줄이 나와있듯이 에러가납니다. 서로 타입이 안맞기 때문입니다.
이 경우에는 아래처럼 형변환을 해주면 됩니다.
형변환을 해주면 정상 작동합니다. 그러나 주의점이 하나 있습니다.
b의 타입을 float64로 바꾸고 a도 float64로 형변환을 해준후에 더하기를 시도해보았습니다.
얼핏봐서는 빨간줄도 안나오고 별 문제가 없어보이지만 직접 실행해보면 panic이 발생하게 됩니다.
이는 a가 처음 10이란 값을 초기값으로 받았을 때 10은 int형이기 때문입니다.
즉, 인터페이스 형변환은 아무 타입으로 형변환이 되는게 아니라 초기값 타입에 맞춰서만 형변환이 되는 것입니다.
조금 특이한 점은 위처럼 a의 타입을 프린트해보면 타입이 빈 인터페이스라고 나오지않고 int형으로 나오게 됩니다.
이제 인터페이스의 타입을 이용한 간단한 if문 패턴을 만들어보겠습니다.
위처럼 코드를 작성하면 a의 원래 타입이 int로 형변환 가능한지를 알 수 있습니다. ; ok 패턴은 많이 쓰인다고 하니 잘 알아두시면 좋습니다.
위 코드의 결과는 a가 int로 형변환이 가능하니 당연히 정상적으로 10이 프린트됩니다.
마지막으로 switch문과 empty interface를 활용한 예제를 보겠습니다.
빈 인터페이스를 함수 인자로 만들게 되면 모든 타입을 받게 되므로 함수내에서 적절한 타입검사를 한 후에 처리를 해야될 것입니다.
이렇게 .(type)을 활용하면 타입별로 체크를 할 수 있습니다. 이 패턴역시 자주 쓰인다고하니 잘 알아두시기 바랍니다.
'golang' 카테고리의 다른 글
Golang network TCP hello world 예제 (0) | 2021.04.05 |
---|---|
golang에서 heap 사용하기 (0) | 2021.04.03 |
golang의 is a 관계 (0) | 2021.03.25 |
golang array와slice (0) | 2021.03.23 |
golang과 함께 알아보는 쿠키 (0) | 2020.12.09 |