제네릭 프로그래밍은 타입 파라미터를 통해서 하나의 함수나 타입이 여러 타입들에 대해서 동작할 수 있도록 하여 코드 재사용성을 늘리는 기법.

Go 1.18 버전부터 새롭게 추가

생각하는 Go 언어 프로그래밍 : Go 제네릭의 이해 - 골든래빗

사용 예시

아래와 같이 제네릭 타입을 인터페이스로 정의하고

(타입 제한을 하기 위해 사용한다.)

type RedisValue interface {
	LoginValue | Key | string
	/*
		커스텀 타입 추가할수있다:<https://velog.io/@excellent/Tutorial-Getting-started-with-generics>
	*/
}

type Key struct {
	Name string
}

type LoginValue struct {
	QueueName   string `json:"queueName"`
	TokenString string `json:"tokenString"`
	Jti         string `json:"jti"`
}

함수의 매개변수는 다음과 같이 선언할 수 있다.

func SetWithoutTTL**[T RedisValue]**(db int, command, key string, **value T**) error {
	//value는 redisUtil.LoginValue 타입이거나... 향후에 또 다른 타입이 될 수도 있음
	dbnumstr := strconv.Itoa(db)
	jsonBody, err := json.Marshal(value)
	if err != nil {
		return err
	}
	bodyReader := bytes.NewReader(jsonBody)
	req, err := http.NewRequest("POST", "<http://localhost>:레디스포트번호/search?db="+dbnumstr+"&command="+command+"&key="+key, bodyReader)
	if err != nil {
		return err
	}
	client := &http.Client{}
	_, respErr := client.Do(req)
	if respErr != nil {
		return respErr
	}
	return nil
}
package main

**type Integer interface {        // ❶ 타입 제한
    int8 | int16 | int32 | int64 | int
}**

func add[T Integer](a, b T) T { // ❷ add() 함수 정의
    return a + b
}

type MyInt int                  // ❸ 별칭 타입 정의

func main() {
    add(1, 2)
    var a MyInt = 3
    var b MyInt = 5
    add(a, b)                 // ❹ 에러 발생
}

아래와 같이 물결표시를 앞에다가 붙임으로써 개선가능하다.

package main

**type Integer interface {        // ❶ 타입 제한
    ~int8 | ~int16 | ~int32 | ~int64 | ~int
}**

func add[T Integer](a, b T) T { // ❷ add() 함수 정의
    return a + b
}

type MyInt int                  // ❸ 별칭 타입 정의

func main() {
    add(1, 2)
    var a MyInt = 3
    var b MyInt = 5
    add(a, b)                 // 정상 작동
}