2009-11-14 11 views
6

Ich fand an interesting blog post über Go.Was sind einige Beispiele für Go-Schnittstellen?

Ich versuche, das Konzept der Schnittstellen zu verstehen, aber ich finde es sehr schwer, dies aus dem Code-Fragment im Blogpost zu tun, und fast unmöglich von the language specification.

Kann jemand auf ein einfaches Beispiel von Go's Schnittstellen in einem Arbeitsprogramm hinweisen?

+0

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

Antwort

4

Es ist eine Work-in-Progress-Lernübung, und sicherlich ein schlechtes Beispiel für guten Stil, aber here you go (spec).

Zusätzlich als exotischere Beispiel machte ich a post auf der Go-Nüsse Mailingliste über Schnittstelle mit {} für Gebäudefunktionen, die mit anonymen Daten arbeiten (in diesem Fall eines „ternärer Lauf“):

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); 
} 
+0

Danke, ich sehe mir dein Beispiel an Ich möchte ein Stück Kompilierungscode verwenden, damit das gut aussieht –

+0

Was bedeutet 'Schnittstelle {}' hier? –

+0

"Schnittstelle {}" ist eine leere Schnittstelle, in oth Also, es passt zu allen Typen. Stellen Sie es sich als einen "beliebigen" Wert vor: ein Mittel zum Schreiben generischer Funktionen, die mit jedem Wert arbeiten können. Leider fehlt hier die Dokumentation sehr; Dies, zusammen mit dem "Reflection" -Paket, gibt Ihnen einige sehr interessante Optionen für die Typisierung. – esm

0

Das grundlegende Konzept von Schnittstellen in Go ist, dass jedes Objekt, das eine Methode implementiert, die eine Schnittstelle definiert, Teil dieser Schnittstelle sein kann.

Das beste Beispiel ist die Writer-Schnittstelle. Rob Pike hat ein Beispiel dafür in seiner Intro-Rede auf Google Tech Talk (http://www.youtube.com/watch?v=rKnDgT73v8s) - blättern Sie zu seiner Erklärung in der Rede zu 33:25.

+0

Danke, aber ich möchte wirklich eine vollständige Code –

2
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. 
} 
3

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. "

+0

Ich weiß, dass du das vor einer Weile gepostet hast, aber es ist ein großartiges Beispiel, also danke! – Xeoncross

+0

Sehr schönes Beispiel, Erklärung und Zitate. +1 – phw

Verwandte Themen