Передать параметр типа с точным ограничением для функции с этим аргументом?

Я начинаю использовать дженерики Go и с трудом понимаю, почему этот код не компилируется:

func f(string) {}

func xyz[T string](p T) {
    f(p) // Error! Cannot use 'p' (type T) as the type string
}

Почему в функции xyz нельзя предположить, что существует ограничение типа для T, такое что T является строковым типом?

Я понимаю, что мог бы просто написать f(string(p)), но меня все равно интересует ответ на вопрос.

Вы также можете изменить объявление f на func f[T string](T) {}. Ограничение типа с одним типом X просто не совпадает с одним типом X.

Erwin Bolwidt 27.11.2022 05:29
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это из-за правил присваиваемости, в вашем конкретном случае это последнее правило.

V является параметром типа, а T не является именованным типом, и значения каждого типа в наборе типов V могут быть присвоены T.

Тип string является именованным типом, и поэтому, хотя каждый тип в наборе типов T может быть назначен string, сам параметр типа T не может быть назначен string.

Вы можете сравнить это с безымянным типом.

func f([]string) {}

func xyz[T []string](p T) {
    f(p) // no issue
}

Другие вопросы по теме