Рассмотрим две функции из экспериментального пакета срезов: Содержать и Увеличить. Обе функции принимают аргументы фрагмента, но с разными ограничениями типа:
Первый аргумент contains имеет тип []E, где E ограничено сравнением, что указывает на то, что E должно быть сопоставимым. . С другой стороны, первый аргумент Grow имеет тип S, ограниченный ~[]E, что указывает на то, что S должен иметь базовый тип, являющийся срезом E.
На первый взгляд может показаться, что между использованием этих двух ограничений типа нет никакой практической разницы. Однако это не тот случай, когда вам нужно вернуть срез того же типа, что и аргумент в Grow.
Если вам нужно вернуть срез того же типа, что и входной аргумент, вы должны использовать параметр типа, который сам ограничивается срезом (например, ~[]E). Это позволяет функции возвращать значение того же типа, что и аргумент.
Давайте рассмотрим две реализации 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 любой).
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3