J'ai trouvé Un blog intéressant publier à propos de Aller. p>
J'essaie de comprendre le concept d'interfaces, mais je trouve qu'il est très difficile de le faire du fragment de code dans le poteau de blog et presque impossible de la spécification de langue . p>
Quelqu'un peut-il signaler un exemple simple d'interfaces d'Allez dans un programme de travail? P>
6 Réponses :
Le concept de base d'interfaces en déplacement est que tout objet implémentant une méthode définie une interface peut faire partie de cette interface. P>
Le meilleur exemple est l'interface de l'écrivain. Rob Pike en a un exemple dans son discours d'introduction sur Google Tech Talk ( http: // www. youtube.com/watch?v=RKNDGT73v8s ) - Faites défiler jusqu'à 33:25 dans le discours de son explication. P>
C'est un exercice d'apprentissage en cours de travail, et certainement un mauvais exemple de bon style, mais Voici ( SPEC ).
En outre, comme exemple plus exotique, j'ai fait Un message sur la liste de diffusion GO-NUTS concernant l'utilisation de l'interface {} pour les fonctions de construction fonctionnant avec des données anonymes (dans ce cas, a" Fonctionnement ternaire "Fonction): P>
package main
import "fmt";
func Tern(exp bool, a interface{}, b interface{}) (interface{}) {
if exp { return a }
return b
}
func main() {
a := 7; b := 1;
result := Tern(a > b, a, b);
fmt.Printf("%d\n", result);
}
Merci, je vais regarder votre exemple. Je veux qu'un morceau de code de compilation fonctionne avec cela semble bon.
Qu'est-ce que interface {} code> signifie ici?
"Interface {}" est une interface vide; En d'autres termes, il correspond à tous les types. Pensez-y comme une "valeur" ": un moyen d'écrire des fonctions génériques pouvant fonctionner sur n'importe quelle valeur. Malheureusement, la documentation manque cruellement ici; C'est ainsi que le paquet "réflexion", vous donne des options vraiment intéressantes pour la manipulation de type.
Je regardais une partie du code de la bibliothèque sur reflect code> mais a fini un peu confus. Il est utilisé beaucoup dans les routines code> printf code> où le type des variables provient des variables elles-mêmes. Mais je me suis perdu dans un labyrinthe torsadeur de dépendances, toutes semblables.
Cet exemple fonctionne bien si l'interface code> est remplacée par int code>. Voir Play.golang.org/p/ww-5ma7m5is .
package main
type Stringer interface {
String() string
}
type pie int
type pizza string
func (p pie) String() string{
return "pie"
}
func (p pizza) String() string{
return "pizza"
}
func main(){
var a pie
var b pizza
fmt.Println(a,b) //fmt.Println() will look for Stringers and call their String() method.
}
Le tutoriel " Interfaces en déplacement 2: Aide adaptable, design évolutif "(janvier 2012, de Sathish VJ fort > ) mentionne clairement l'avantage principal des interfaces en déplacement:
Go's Interfaces ne sont pas une variante sur les interfaces Java ou C #, elles sont beaucoup plus.
Ils sontune clé de la programmation à grande échelle et de la conception évolutive adaptable forte>. P> BlockQuote> Voir cet exemple, à partir du même article, à propos de la perspective différente (interface) pour un bus: p>
xxx pré> Il semble être Centric Data Centric - définir vos données d'abord et construire vos abstractions d'interface au fur et à mesure.
La hiérarchie ici est une sorte de "le long du chemin" sans l'indiquer explicitement - en fonction des signatures de méthode associées au type, il est compris comme implémentant des interfaces spécifiques. P>Supposons maintenant que le temps a évolué, certaines des exigences de projet de notre bus ont changé - il y a maintenant une nouvelle loi qui dit que chaque passager doit au moins avoir une certaine quantité minimale de volume cubique.
Notre bus doit maintenant adhérer à une nouvelle interface appeléepersonalspacelaw code> qui est distinct de l'une des autres interfaces qu'il implémente déjà p> blockQuote>xxx pré> La fonctionnalité a été étendue sans modification des classes principales ou des hiérarchies de base. Cette implémentation est beaucoup plus propre, facilement extensible et peut améliorer mieux avec les besoins changeants des exigences du projet. P> blockQuote>
Voici le Programme de travail complet dans le terrain de jeu Strong> P>
L'article se termine par la citation de John Asmuth à partir du thread sur la productivité des interfaces à partir: P>
"C'est le fait que je n'ai pas besoin de passer du temps à convenir à la conception d'une sorte de hiérarchie de type, puis de le réorganiser deux ou trois fois avant que je finisse.
Ce n'est même pas le fait qu'il est facile de le faire correctement -
C'est le fait que je n'ai tout simplement pas à m'en soucier et peut continuer avec l'algorithme réel. strong> " p> blockQuote> p>
Je sais que tu as posté cela il y a un moment, mais c'est un excellent exemple, alors merci!
Très bel exemple, explication et citations. +1
Je ne sais pas comment c'est un exemple de quoi que ce soit. Voici le même code où les interfaces ont été supprimées, en travaillant simplement: play.golang.org/p/wxpl78maqrv
@VONC Top-Notch Répondez à propos de définir vos données d'abord, puis de construire votre interface. J'ai suscité votre réponse et je l'ai cité. Voir Stackoverflow.com/a/62297796/12817546 .
@Tomj j'aime aussi lrry.tv/@dfeutury:5/... , et
Wikipedia explique le typing de canard et a un exemple en déplacement. http://fr.wikipedia.org/wiki/duck_typing P>
À partir de 2018, le seul exemple il y a dans Python 3
Extension @jessta Excellent exemple. Un exemple simple de l'utilisation de l'interface d'utilisation d'un programme de travail pour accéder à la bibliothèque standard de Go est donné.
package main
import (
"encoding/json"
. "fmt"
)
func main() {
var i interface{} = c
e := func() error { return c } // type error interface { Error() string}
Println(e()) // Hiss
s := func() Stringer { return d } // type Stringer interface {String() string}
// func Println(a ...interface{}) (n int, err error)
Println(s()) // Woof
d := `{"Pet":"Dog","Age":2, "Eat": "Bone"}`
json.Unmarshal([]byte(d), &i) // func Unmarshal(data []byte, v interface{}) error
m := i.(map[string]interface{})
Println(m["Age"]) // 2
}
type cat string
type dog string
var c cat
var d dog
func (cat) Error() string { return "Hiss" }
func (dog) String() string { return "Woof" }
Decouple code avec une interface. Voir Stackoverflow.com/a/62297796/12817546 . Appelez une méthode "de manière dynamique". Voir Stackoverflow.com/a/62336440/12817546 . Accédez à un package Go. Voir Stackoverflow.com/a/62278078/12817546 . Attribuez une valeur à une variable. Voir Stackoverflow.com/a/62337836/12817546 .
Quelques ressources qui pourraient aider: gobyexample.com/interfaces + Laktek.com/2012/02/13/learning-go-interfaces-Flections + golangtutorials.blogspot.com.au/2011/06/interfaces-in- Go.htm l
Exemples d'interfaces Go? Decouple code. Voir Stackoverflow.com/a/62297796/12817546 . Appelez une méthode "de manière dynamique". Voir Stackoverflow.com/a/62336440/12817546 . Accédez à un package Go. Voir Stackoverflow.com/a/62278078/12817546 . Attribuez une valeur à une variable. Voir Stackoverflow.com/a/62337836/12817546 .