Развертывание слайса в качестве аргумента к методу fmt.Print
недавно начал изучать golang и столкнулся с такой проблемой.
func Print(a ...interface{}) (n int, err error)
Я понял, что метод fmt.Print принимает в качестве аргументов значения с типом пустого интерфейса и создает слайс "a" с типом interface{}, и по факту в метод можно передать переменную любого типа, ведь все типы реализуют пустой интерфейс. Т.е в метод можно спокойно передать слайс с типом int. Но если применить операцию развертывания к интовому слайсу, то метод выдаст ошибку. Почему оно не может принять тип []int, ведь он тоже реализует пустой интерфейс? Хотелось бы подробнее узнать, как работает развертывание
package main
import "fmt"
func main() {
// func Print(a ...interface{}) (n int, err error)
slice := []int{1, 2, 3, 4, 5}
fmt.Print(slice)
fmt.Print(slice...) //Cannot use 'slice' (type []int) as the type []interface{}
}
https://go.dev/play/p/0LJsnqSRPTX
Ответы (1 шт):
Функция ждет на вход массив интерфейсов а вы передаете массив int, магия не срабатывает т.к. разворачивание слайса приводит к строгому типу на выходе []int вместо ожидаемого []interface{}
Можно вот так:
package main
import "fmt"
//внимание на тип принимаемого параметра, не массив интерфейсов, а массив чисел!!!!
func Cast(s ...int) interface{} {
return s
}
func main() {
slice := []int{1, 2, 3, 4, 5}
fmt.Print(slice)
fmt.Print(Cast(slice...))
}