when to use generics


원문의 요약글

when to use generics

  • ADT 구현시 사용할 수 있다. string, int, struct 벨류를 갖는 이진트리, 연결리스트, 힙 등
  • 다양한 타입을 가질 수 있는 slice, map, channel을 다뤄야할 때
  • 아래의 Interface는 go의 sort 패키지의 sort.go에 있는 IntSlice, Float64Slice, StringSlice 등의 타입이 각각 구현한 인터페이스인데, sliceFn같은 여러 타입을 수용할 수 있는 구조체를 만들어두면 sort.go 내부의 구현처럼 타입별로 하나하나 구현해줄 필요가 없어진다.
     type Interface interface {
         Len() int
         Less(i, j int) bool
         Swap(i, j int)
     }
    
     type sliceFn[T any] struct {
         s []T
         compare func(T, T) bool
     }
    
     func (s sliceFn[T]) Len() int { return len(s.s) }
     func (s sliceFn[T]) Less(i, k int) {return s.compare(s.s[i], s.s[j])}
     func (s sliceFn[T]) Swap(i, j int) {s.s[i], s.s[j] = s.s[j], s.s[i] }

when not to use generics

  • 단순히 type argument(타입 파라미터에 입력된 그 타입)의 메서드를 호출하는 경우
  • 아래의 경우 foo 함수에 어떤 타입이 입력되더라도 상관없이 그저 입력된 w에 입력된 byte를 쓸 분이다.
      func foo[T io.Writer](w T) {
          _, _ = w.Write([]byte("hello"))
      }
  • 이렇게 쓰면 된다.
      func foo(w io.Writer) {
          w.Write([]byte("hello"))
      }
  • 타입파라미터를 써서 코드의 가독성이 더 떨어질 때