«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Когда использовать ~[]E или []E для аргументов среза в Go?

Когда использовать ~[]E или []E для аргументов среза в Go?

Опубликовано 4 ноября 2024 г.
Просматривать:737

When to Use ~[]E vs []E for Slice Arguments in Go?

Изучение тонкостей общих аргументов срезов

Рассмотрим две функции из экспериментального пакета срезов: Содержать и Увеличить. Обе функции принимают аргументы фрагмента, но с разными ограничениями типа:

Ограничения типа

Первый аргумент contains имеет тип []E, где E ограничено сравнением, что указывает на то, что E должно быть сопоставимым. . С другой стороны, первый аргумент Grow имеет тип S, ограниченный ~[]E, что указывает на то, что S должен иметь базовый тип, являющийся срезом E.

Практические последствия

На первый взгляд может показаться, что между использованием этих двух ограничений типа нет никакой практической разницы. Однако это не тот случай, когда вам нужно вернуть срез того же типа, что и аргумент в Grow.

Значение параметра типа с ограниченным срезом

Если вам нужно вернуть срез того же типа, что и входной аргумент, вы должны использовать параметр типа, который сам ограничивается срезом (например, ~[]E). Это позволяет функции возвращать значение того же типа, что и аргумент.

Демонстрация с Grow

Давайте рассмотрим две реализации Grow:

func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s
func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E

При передаче среза пользовательского типа с срезом в качестве базового типа , Grow может возвращать значение того же типа, а Grow2 — нет. Grow2 может возвращать только значение безымянного типа среза, []E.

Пример

type ints []int // user-defined slice type ints
x := []int{1} // initialize a slice x of type []int
x2 := Grow(x, 10) // x2 will be of type []int
y := ints{1} // initialize a slice y of type ints
y2 := Grow(y, 10) // y2 will be of type ints

Здесь Grow2(y, 10) получает значение типа ints, но возвращает значение типа []int, что не является предполагаемое поведение.

Заключение

В заключение, когда вызов функции требует возврата среза того же (возможно, именованного) типа, что и аргумент, используйте параметр типа, который сам ограничивается срезом (~[]E) необходим. В противном случае можно использовать параметр типа, который ограничивает только тип элемента (E любой).

Заявление о выпуске Эта статья воспроизведена: 1729668019 Если есть какие -либо нарушения, пожалуйста, свяжитесь с [email protected], чтобы удалить его.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3