2014-12-29 14 views
10

Ich möchte nur einige Code wie folgt schreiben:Convert [] String [] Schnittstelle {}

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 
} 

ich interface{} dachte jede Art darstellen kann, so kann []interface auch jede []type vor darstellen, jetzt weiß ich, Ich bin falsch, []type ist ein ganzer Typ, kann nicht als []interface{} betrachtet werden.

Also, kann mir jemand helfen, wie dieser Code funktioniert, oder eine andere Lösung ?.

PS: Ich weiß, dass []byte oder string können in andere umwandeln werden, aber es ist eigentlich nicht meine Absicht, kann es eher eine andere Art als []byte und string.

+0

mögliches Duplikat [Converting Scheibe structs leerer Schnittstelle zu schneiden] (http://stackoverflow.com/questions/9121515/ converting-slice-of-structs-to-slice-of-empty-interface) – Volker

Antwort

13

jetzt ich weiß, dass ich falsch bin, ist []type eine ganze Art, nicht als []interface{} betrachtet werden kann.

Ja, und das ist, weil interface{} ist ein eigener Typ (und kein "Alias" für einen anderen Typ).
Wie ich in „what is the meaning of interface{} in golang?“ erwähnen (wenn v ist eine interface{} Variable):

Anfänger gophers geführt werden, zu glauben, dass „v jeglicher Art ist“, aber das ist falsch.
v ist von keiner Art; es ist von interface{} Art.

Die FAQ mentions

sie nicht die gleiche Darstellung in Erinnerung haben.

Es ist notwendig, die Elemente einzeln in das Ziel-Slice zu kopieren.
Dieses Beispiel wandelt ein Stück int zu einer Scheibe interface{}:

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

Danke für deine Antwort, und ich habe eine andere Frage ist das kann '[] Interface {Slice ...}' Arbeit sein? Genau wie '[] Interface {" aaa "," bbb "}' – cosiner

+0

@cosiner meinen Sie wie in einer Funktions-API verwendet? Ich sehe das eher als Parameter an variadic Funktionen übergeben: https://golang.org/ref/spec#Passing_arguments_to_..._parameters – VonC

+0

@cosiner für Slices, können Sie stattdessen die 'append()' Funktion versuchen: https: // golang.org/ref/spec#Appending_and_copying_slices – VonC