Voglio creare un metodo che concatena l'API in Go. In tutti gli esempi riesco a trovare che le operazioni concatenate sembrano sempre avere successo, cosa che non posso garantire. Cerco quindi di estenderli per aggiungere il valore di ritorno dell'errore.Vai al concatenamento del metodo e alla gestione degli errori
Se lo faccio come questo
package main
import "fmt"
type Chain struct {
}
func (v *Chain)funA() (*Chain, error) {
fmt.Println("A")
return v, nil
}
func (v *Chain)funB() (*Chain, error) {
fmt.Println("B")
return v, nil
}
func (v *Chain)funC() (*Chain, error) {
fmt.Println("C")
return v, nil
}
func main() {
fmt.Println("Hello, playground")
c := Chain{}
d, err := c.funA().funB().funC() // line 24
}
Il compilatore mi dice chain-err-test.go:24: multiple-value c.funA() in single-value context
e non verrà compilato. Esiste un buon modo in modo che funcA, funcB e funcC possano segnalare un errore e interrompere quella catena?
È possibile utilizzare il panico, ma ovviamente questo significa che dovrete recuperare su ciascun metodo o alla radice di esso. Puoi anche rendere l'oggetto 'Chain' statico con un errore e controllarlo per ciascun metodo. –
@Not_a_Golfer true, ma mi chiedo se ci sia un buon modo idiomatico per farlo. Nel mio mondo le condizioni di errore sono ovunque e in alcuni luoghi (ad esempio, gli operatori come in http://www.golangpatterns.info/object-orientated/operators) tale concatenamento dovrebbe fornire una buona API. (il primo esempio di quella pagina non è una bella API - o hai un sacco di funzioni per tutti i tipi o un interruttore in cui i tipi errati non vengono rilevati dal compilatore) – johannes
Ricordo una API migliore che include funzioni che restituiscono funzioni, come in http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis (fatto dopo http://commandcenter.blogspot.com.au/2014/01/self-referential-functions -e-design.html). Tuttavia non è esattamente "concatenare". – VonC