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
.
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 deinterface{}
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 deinterface{}
:
t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
s[i] = v
}