일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- apollo router
- 배포 프로세스
- 대규모 시스템 설계
- golang
- 오블완
- Buffered channel
- Kubernetes
- 컴포지트패턴
- System Design
- Intellij
- body size
- UnBuffered channel
- Logrus
- gitops
- Golines
- elasticsearch
- 윈도우키보드
- 사설 ip
- go
- Infra
- GoF 디자인패턴
- AWS
- 티스토리챌린지
- intellij ide
- 배포 파이프라인
- GoF
- http 413
- goland
- 디자인패턴
- notification system
Archives
- Today
- Total
Fall in IT.
Go 1.18버전부터 추가 된 generic 사용해보기 본문
반응형
안녕하세요.
오늘은 Go 1.18 버전에서 추가 된 generic을 사용해보도록 하겠습니다.
Generic에 대한 개념은 여기서 확인해주시기 바랍니다.
Generic 사용 전 (source code)
interface를 사용하여 스택을 구현한 경우
package main
import "fmt"
type stack struct {
data []interface{}
}
type Stack interface {
Push(data interface{})
Pop() interface{}
Get() []interface{}
}
func New() Stack {
return &stack{
data: []interface{}{},
}
}
func (s *stack) Push(data interface{}) {
fmt.Println("push data: ", data)
s.data = append(s.data, data)
}
func (s *stack) Pop() interface{} {
lastData := s.data[len(s.data)-1]
fmt.Println("pop data: ", lastData)
s.data = s.data[:len(s.data)-1]
return lastData
}
func (s *stack) Get() []interface{} {
return s.data
}
func main() {
stack := New()
stack.Push("10")
stack.Push("20")
stack.Push("30") // string이 아닌 어떤 타입도 넣어도 에러가 발생하지 않는다.
stack.Push("40")
stack.Pop()
response := stack.Get() // response 배열 안에 담긴 데이터의 타입을 알 수 없다.
fmt.Println(response...)
}
문제점
- 스택에 어떤 타입의 데이터를 넣어도 에러가 발생하지 않는다.
즉, string 타입의 원소만 들어가는 스택으로 사용하고 싶은경우 실수로 int형 타입의 원소가 들어왔을때 컴파일 단계에서 알수가 없다. - 스택의 데이터를 조회 했을때 해당 원소가 어떤 타입인지 알 수 없다.
Generic 사용 후 (source code)
generic을 사용하여 스택을 구현한 경우
package main
import (
"fmt"
)
type stack[T any] struct {
data []T
}
type Stack[T any] interface {
Push(data T)
Pop() T
Get() []T
}
func New[T any]() Stack[T] {
return &stack[T]{
data: []T{},
}
}
func (s *stack[T]) Push(data T) {
fmt.Println("push data: ", data)
s.data = append(s.data, data)
}
func (s *stack[T]) Pop() T {
lastData := s.data[len(s.data)-1]
fmt.Println("pop data: ", lastData)
s.data = s.data[:len(s.data)-1]
return lastData
}
func (s *stack[T]) Get() []T {
return s.data
}
func main() {
intStack := New[int]()
intStack.Push(1)
intStack.Push(2)
intStack.Push(3)
intStack.Push(4)
intStack.Pop()
response := intStack.Get()
fmt.Println(response)
stringStack := New[string]()
stringStack.Push("a")
stringStack.Push(100) // Error - 타입이 맞지않기 때문에 컴파일 단계에서 에러 발생
stringStack.Push("c")
stringStack.Push("d")
stringStack.Pop()
response2 := stringStack.Get()
fmt.Println(response2) // response2에 담긴 원소는 무조건 string 타입이다
}
generic을 사용함으로써 위에서 발생한 문제를 해결할 수 있다.
결과
generic을 사용함으로써 아래와 같은 장점이 생겼다!
- 컴파일 단계에서 타입 체크가 가능하여 안정적으로 코딩할 수 있다.
- 사용하는 시점에 타입을 지정할 수 있기 때문에 명확하게 코딩할 수 있다.
반응형
'프로그래밍언어 > Golang' 카테고리의 다른 글
Go언어 Golines을 사용해서 보기좋게 포맷팅하기 (0) | 2023.02.16 |
---|---|
Golang Singleton Pattern 간단하게 알아보기 (0) | 2022.06.15 |
Golang Slice 중복 제거하는 방법 (0) | 2022.03.06 |
Go 함수에서 포인터형 매개변수 사용하기 (0) | 2021.06.27 |
Golang JSON 인코딩 / 디코딩 방법 (0) | 2020.09.28 |
Comments