Подтвердить что ты не робот

Преобразовать [] строку в [] интерфейс {}

Я просто хочу написать такой код:

func (w Writer) WriteVString(strs []string) (int, error) {
    return writeV(func(index int, str interface{}) (int, error) {
        return w.WriteString(str.(string))
    }, strs) // it doesn't work
}

func (w Writer) WriteV(bs [][]byte) (int, error) {
    return writeV(func(index int, b interface{}) (int, error) {
        return w.Write(b.([]byte))
    }, []interface{}{bs...}) // it also can't be compiled
}
type writeFunc func(int, interface{}) (int, error)

func writeV(fn writeFunc, slice []interface{}) (n int, err error) {
    var m int
    for index, s := range slice {
        if m, err = fn(index, s); err != nil {
            break
        }
        n += m
    )
    return
}

Я думал, что interface{} может представлять любой тип, поэтому []interface также может представлять любой []type раньше, теперь я знаю, что я ошибаюсь, []type является целым типом, не может считаться []interface{}.

Итак, может ли кто-нибудь помочь мне, как заставить этот код работать или какое-либо другое решение?

PS. Я знаю, что []byte или string можно преобразовать в другое, но на самом деле это не мое намерение, может быть другой тип, а не []byte и string.

4b9b3361

Ответ 1

Теперь я знаю, что ошибаюсь, []type - это целый тип, не может считаться []interface{}.

Да, и это потому, что interface{} - это собственный тип (а не "псевдоним" для любого другого типа).
Как я упоминаю в в чем смысл interface{} в golang?" (если v является переменной interface{}):

Начинающие суслики убеждены, что "v имеет любой тип", но это неправильно.
v не имеет никакого типа; он имеет тип interface{}.

Часто задаваемые вопросы

они не имеют того же представления в памяти.

Необходимо скопировать элементы по отдельности на целевой срез.
Этот пример преобразует срез int в срез interface{}:

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}