Sto provando a digitare asser da []Node
, a []Symbol
. Nel mio codice, Symbol
implementa l'interfaccia Node
.Posso digitare una fetta di valori dell'interfaccia?
Ecco alcuni codice circostante:
43 func applyLambda(args []Node, env Env) Node {
44 if len(args) > 2 {
45 panic("invalid argument count")
46 }
47 fixed, rest := parseFormals(args.([]Symbol))
48 return Func{
49 Body: args[1],
50 FixedVarNames: fixed,
51 RestVarName: rest,
52 }
53 }
Ecco l'errore che ottengo:
./builtins.go:47: invalid type assertion: args.([]Symbol) (non-interface type []Node on left)
Sono sicuro che ci sia una buona ragione per questo. Qual è il modo migliore di procedere?
Non sono d'accordo con il tuo sentenso "Quindi non ha senso pensare che una porzione di valori dell'interfaccia sia anche un'interfaccia". Le conversioni sono conversioni: le interfacce sono interfacce. Sono concetti separati (almeno nella mia mente). Gli autori Go avrebbero potuto decidere di supportare le conversioni da '[] Node' a' [] Symbol', ma non lo hanno fatto perché è troppo costoso e tali conversioni non sono un modello di programmazione comune. Teoricamente, qualsiasi conversione che non implichi una contraddizione né un problema ha senso, ma i progettisti di linguaggi devono scegliere quali conversioni inserire nella lingua. –
Non posso dire con certezza cosa ne pensino gli autori di questo argomento, ma continuo a pensare che la mia ipotesi sia vera. Hai ragione che questa conversione è troppo costosa, ma non penso che sia la ragione per renderla illegale. Come ho detto, in Go slice è un tipo. Puoi dire 'type Nodes [] Node'. 'Nodes' è un tipo di interfaccia? No. Quindi vedo che questo è il motivo per cui non possiamo affermare variabili di tipo '[] Nodo'. Ti piacerebbe fare questa discussione sulla mailing list golang-nuts? – Mostafa
@Atom: la domanda non chiede informazioni sulle conversioni; chiede di tipo asserzioni – newacct