Зачем нужны дженерики, если можно проще?
Кто в теме, объясните, пожалуйста, почему в golang нельзя []что-то привести к []interface{} :
Привести можно, но это необходимо сделать самостоятельно. interface{} это отдельный тип и slice []interface{} может принять только срез этого типа.

func remove(slice []interface{}, s interface{}) []interface{} {
    return append(slice[:s.(int)], slice[s.(int)+1:]...)
}

func main() {
  a := []string{"a", "b", "c"}
  // преобразование
  ai := make([]interface{}, len(a))
  for i, v := range a {
    ai[i] = v
  }
  ai = remove(ai, 2)

  b := []int{1, 2, 3}
  // преобразование
  bi := make([]interface{}, len(b))
  for i, v := range b {
    bi[i] = v
  }
  bi = remove(bi, 1)
        
  fmt.Printf("%T: %v\n", ai, ai)
  fmt.Printf("%T: %v\n", bi, bi)
}
https://play.golang.org/p/gRHqO31LIJU

В смысле, почему не сделать, чтобы так было можно. 
Потому что s []string это массив массивов типа byte, а i []int массив чисел типа int и они имеют в памяти разное представление.

Такая же история:
func main() {
  b := []i1{i1("xyz")}
  bi := make([]intf, len(b))
  for i, v := range b {
     bi[i] = v
  }
  print1(bi)
}
https://play.golang.org/p/z9BoM5lutV0
В Go отстойная алгебра интерфейсов. Если структура A реализует интерфейс I, это не значит, что []A реализует []I.
А всё потому что приведение типов к интерфейсу - это манипуляции с идентификатором типа в структуре. Очевидно, нужно в цикле заменить этот идентификатор в каждом элементе слайса, чтобы достичь нужного эффекта. Хотелось бы, чтобы это инлайнилось или как-то при компиляции автоматом обрабатывалось, но вот пока нет.