Das Tutorial "Interfaces in Go - Part 2: Aiding adaptable, evolutionary design" (Januar 2012 von Sathish VJ) erwähnt deutlich den Hauptvorteil für Schnittstellen in Go:
Gos interfac Es sind keine Varianten von Java- oder C# -Schnittstellen, sie sind viel mehr.
Sie sind ein Schlüssel zu groß angelegten Programmierung und anpassungsfähig, evolutionäres Design.
Sehen Sie dieses Beispiel aus dem gleichen Artikel über andere Perspektive (Schnittstelle) für einen Bus:
package main
import "fmt"
//Go Step 1: Define your data structures
type Bus struct {
l, b, h int
rows, seatsPerRow int
}
//Go Step 2: Define a real world abstraction that could use the data we structure we have
type Cuboider interface {
CubicVolume() int
}
//Go Step 3: Implement methods to work on data
func (bus Bus) CubicVolume() int {
return bus.l * bus.b * bus.h
}
//Go step - repeat 2 & 3 for any other interfaces
type PublicTransporter interface {
PassengerCapacity() int
}
func (bus Bus) PassengerCapacity() int {
return bus.rows * bus.seatsPerRow
}
func main() {
b := Bus{
l:10, b:6, h:3,
rows:10, seatsPerRow:5}
fmt.Println("Cubic volume of bus:", b.CubicVolume())
fmt.Println("Maximum number of passengers:", b.PassengerCapacity())
}
Es scheint, datenzentrierten zu sein - definieren Sie Ihre Daten zuerst und bauen Sie Ihre Schnittstelle Abstraktionen wie du mitgehst.
Hierarchie hier ist eine Art von 'auf dem Weg' ohne explizite Angabe - abhängig von der Methode Signaturen im Zusammenhang mit dem Typ, es versteht sich als Umsetzung bestimmter Schnittstellen.
Nehmen wir an, dass sich mit der Zeit einige der Projektanforderungen für unseren Bus geändert haben - jetzt gibt es ein neues Gesetz, das besagt, dass jeder Passagier mindestens eine bestimmte Mindestmenge an Kubikvolumen haben sollte.
Unser Bus jetzt hat nun eine neue Schnittstelle PersonalSpaceLaw
genannt zu halten, die verschieden ist von einer der anderen Schnittstellen bereits implementiert
//new requirement that the Bus must be compatible with
type PersonalSpaceLaw interface {
IsCompliantWithLaw() bool
}
func (b Bus) IsCompliantWithLaw() bool {
return (b.l * b.b * b.h)/(b.rows * b.seatsPerRow) >= 3
}
Die Funktionalität der Kernklassen ohne Änderung verlängert wurde oder Kernhierarchien. Diese Implementierung ist viel sauberer, leicht erweiterbar und kann mit den sich ändernden Anforderungen der Projektanforderungen besser skaliert werden.Hier
ist die full working program in Go Playground
Der Artikel endet mit John Asmuth Zitat von aus dem Thread über die Produktivität von Schnittstellen in Go:
„Es ist die Tatsache, dass ich nicht Ich muss Zeit damit verbringen, eine Art Hierarchie zu entwerfen und sie dann zwei oder drei Mal neu zu arrangieren, bevor ich fertig bin. "
Es ist nicht einmal die Tatsache, dass es einfach ist, es richtig zu machen -
es ist die Tatsache, dass ich mich einfach nicht darum kümmern muss und mit dem eigentlichen Algorithmus weitermachen kann. "
Einige Ressourcen, die helfen könnten:. Https://gobyexample.com/interfaces + http: //www.laktek. com/2012/02/13/lernen-gehen-Schnittstellen-Reflexionen/+ http://golanchtutorials.blogspot.com.au/2011/06/interfaces-in-go.html – elithrar