web-dev-qa-db-fra.com

Convertir la chaîne [] en interface [] {}

Je veux juste écrire du code comme ceci:

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
}

J'ai pensé interface{} peut représenter n'importe quel type, donc []interface peut également représenter n'importe quel []type avant, maintenant je sais que je me trompe, []type est un type entier, ne peut pas être considéré comme []interface{}.

Alors, quelqu'un peut-il m'aider à faire fonctionner ce code ou toute autre solution?

PS : Je sais que []byte ou string peuvent être convertis les uns aux autres, mais ce n'est pas vraiment mon intention, il peut y avoir un autre type plutôt que []byte et string.

28
cosiner

maintenant je sais que je me trompe, []type est un type entier, ne peut pas être considéré comme []interface{}.

Oui, et c'est parce que interface{} est son propre type (et pas un "alias" pour tout autre type).
Comme je le mentionne dans " quelle est la signification de interface{} in golang? "(si v est un interface{} variable):

Les golfeurs débutants sont amenés à croire que "v est de tout type", mais c'est faux.
v n'est d'aucun type; c'est de interface{} type.

Les FAQ mentionne

ils n'ont pas la même représentation en mémoire .

Il est nécessaire de copier les éléments individuellement dans la tranche de destination .
Cet exemple convertit une tranche d'int en une tranche de interface{}:

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