Вывод типа в Go
При обращении к обобщенной функции угловые скобки с типом часто можно не писать. Компилятор смотрит на тип аргумента и сам выбирает имя для параметра типа, если однозначный выбор возможен.
Явная запись типа в угловых скобках тоже допустима: она нужна, когда аргументов нет или тип из контекста не виден. Оба способа дают один и тот же проверенный код после сборки.
Проверим вывод на функции с одним параметром:
package main
import "fmt"
func First[T any](items []T) T {
return items[0]
}
func main() {
nums := []int{4, 5, 6}
fmt.Println(First(nums))
words := []string{"a", "b"}
fmt.Println(First(words))
}
Для среза целых параметр типа становится
int, для строкового среза
string. Скобки с типом в тексте
программы не понадобились.
Тот же тип можно указать явно перед скобками с аргументами:
package main
import "fmt"
func First[T any](items []T) T {
return items[0]
}
func main() {
nums := []int{1, 2}
fmt.Println(First[int](nums))
}
Дан следующий срез:
flags := []bool{true, false}
Передайте flags в обобщенную
First без угловых скобок с типом
и выведите первый элемент.
Дан следующий код:
func Zero[T any]() T {
var z T
return z
}
Скажите, нужно ли здесь явно писать тип в угловых скобках при обращении к функции.
Объявите обобщенную Last для среза
с тем же параметром типа, что у
First, создайте срез дробных
1.5 и 2.5, выведите
последний элемент с явным float64
в угловых скобках.