Vous ne pouvez pas. Mieux que vous pouvez faire est d'écrire une fonction d'assistance (et faire l'affirmation de type à cela):
func getDonut(p interface{}, err error) (Donut, error) {
return p.(Donut), err
}
Et puis il devient une ligne:
d, err := getDonut(getPastry())
Ou vous pouvez même « intégrer » la getPastry()
appel à la fonction d'aide:
func getDonutPastry() (Donut, error) {
p, err := getPastry()
return p.(Donut), err
}
Et puis l'appeler (une seule ligne encore plus courte):
d, err := getDonutPastry()
Note:
Bien sûr, si la valeur retournée par getPastry()
est pas de type dynamique Donut
, ce sera une panique d'exécution. Pour éviter cela, vous pouvez utiliser le formulaire spécial du type assertion:
v, ok := x.(T)
Ce qui donne une valeur booléenne typées supplémentaire. La valeur de ok
est true
si l'assertion est valide. Sinon, il s'agit de false
et la valeur v
correspond à la valeur zéro pour le type T
. Aucune panique d'exécution ne se produit dans ce cas.
versions sûres des fonctions d'aide en utilisant la forme spéciale pourrait ressembler à ceci (ils renvoient une erreur plutôt que la panique):
func getDonut2(p interface{}, err error) (Donut, error) {
if d, ok := p.(Donut); ok {
return d, err
} else {
return "", errors.New("Not a Donut!")
}
}
func getDonutPastry2() (Donut, error) {
p, err := getPastry()
if d, ok := p.(Donut); ok {
return d, err
} else {
return "", errors.New("Not a Donut!")
}
}
Voir les questions relatives:
Return map like 'ok' in Golang on normal functions
Go: multiple value in single-value context
OMI cet exemple montre les mauvaises pratiques que nous faisons une affirmation de type sans vérifier une erreur, où la fonction d'emballage donne l'impression qu'il retournera des erreurs et ne paniquera pas. – baloo
@baloo Voir les réponses aux questions. – icza
bonnes notes supplémentaires! – baloo