Структуры и интерфейсы

Go Generics

Write one function or type that works with many types using type parameters.

  • Средний
  • Чтение: 5 мин
  • Примеров для запуска: 1
Что вы узнаете
  • Type parameters
  • Constraints
  • Generic types
Sum[T Number]
Sum([]int{1, 2, 3})6
Sum([]float64{1.5, 2.5})4

One definition, many types

Generics let you write code once and use it with different types. A type parameter such as T, written in square brackets, stands for a type that is chosen where the code is used.

Number is a constraint: Sum accepts any type built on int or float64. Map has two type parameters, so it can turn a slice of one type into a slice of another. Stack[T] is a generic type, and Stack[string] is a stack of strings.

Главное

  1. [T Number] limits T to numbers.
  2. any allows every type.
  3. Stack[string] is a stack of strings.

Пример на Go, который можно запустить

Go
Запустить код →
main.go
package main

import (
	"fmt"
	"strings"
)

type Number interface {
	~int | ~float64
}

func Sum[T Number](values []T) T {
	var total T
	for _, value := range values {
		total += value
	}
	return total
}

func Map[T, U any](items []T, convert func(T) U) []U {
	result := make([]U, 0, len(items))
	for _, item := range items {
		result = append(result, convert(item))
	}
	return result
}

type Stack[T any] struct {
	items []T
}

func (s *Stack[T]) Push(item T) { s.items = append(s.items, item) }

func (s *Stack[T]) Pop() (T, bool) {
	var zero T
	if len(s.items) == 0 {
		return zero, false
	}
	last := s.items[len(s.items)-1]
	s.items = s.items[:len(s.items)-1]
	return last, true
}

func main() {
	fmt.Println(Sum([]int{1, 2, 3}), Sum([]float64{1.5, 2.5}))
	fmt.Println(Map([]int{1, 2, 3}, func(n int) string { return strings.Repeat("*", n) }))

	stack := &Stack[string]{}
	stack.Push("a")
	stack.Push("b")
	top, _ := stack.Pop()
	fmt.Println(top, len(stack.items))
}
Получить кнопку запуска для этого примера Результат выполнения
6 4
[* ** ***]
b 1

Практика

Откройте пример в онлайн-компиляторе, измените значение или добавьте строку и попробуйте предсказать вывод до запуска. Затем намеренно сломайте код и прочитайте сообщение компилятора.

Закончили этот урок?

Отметьте его как изученный, чтобы следить за прогрессом.

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи