Общие аргументы среза: понимание различий
В Go универсальное программирование вводит параметры типа, которые позволяют функциям работать с разными типами. Одной из областей интереса является различие между аргументами среза, ограниченными типами среза, и общими аргументами среза.
Аргумент среза, ограниченный типами среза
Рассмотрим функцию среза. первый аргумент ограничен ~[]E. Это означает, что тип этого аргумента должен быть типом среза с типом элемента E.
Общий аргумент среза
Напротив, рассмотрим функцию слайсы.Contains с первым аргументом, просто набранным как []E. Это позволяет использовать любой тип среза с типом элемента E.
Практические различия
Первоначально может показаться, что эти два типа аргументов среза ведут себя одинаково, поскольку они оба позволяют функциям получать доступ к операциям среза, таким как добавление и диапазон. Однако есть тонкое, но важное различие, когда дело доходит до возврата среза.
Возврат среза
Если функция требует возврата среза того же типа, что и входной срез, вы должны использовать аргумент среза, ограниченный типами среза (~[]E). Это гарантирует, что возвращаемый срез имеет правильный базовый тип.
Пример
Давайте сравним две реализации Grow(): одну с использованием ~[]E, а другую с использованием [ ]E.
func Grow[S ~[]E, E any](s S, n int) S {
// ...
}
func Grow2[E any](s []E, n int) []E {
// ...
}
Если мы передаем фрагмент пользовательского типа (например, []MyInt), Grow() может вернуть значение того же типа. Однако Grow2() может возвращать только общий тип среза ([]E).
Заключение
В общем, если вам нужно вернуть срез одного и того же type в качестве входного среза, вы должны использовать аргумент среза, ограниченный типами среза (~[]E). В противном случае достаточно использовать общий аргумент среза.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3