Развертывание слайса в качестве аргумента к методу 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...)) 
}
→ Ссылка