il tutorial "Interfaces in Go - Part 2: Aiding adaptable, evolutionary design" (gennaio 2012, dalle Sathish VJ) menziona chiaramente il vantaggio principale per le interfacce a Go:
interfac Go non sono una variante su interfacce Java o C#, sono molto di più.
Sono una chiave per la programmazione su larga scala e adattabile, design evolutivo.
Guarda questo esempio, dal medesimo articolo, sulla prospettiva diversa (interfaccia) per un autobus:
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())
}
Sembra essere dati centric - definire i dati prima e costruire le vostre astrazioni di interfaccia mentre vai avanti.
La gerarchia qui è di tipo "costruita" senza specificarlo esplicitamente - a seconda delle firme del metodo associate al tipo, si intende l'implementazione di interfacce specifiche. Supponiamo ora che, col passare del tempo, alcuni dei requisiti del progetto per il nostro Bus siano cambiati - ora c'è una nuova legge che dice che ogni passeggero dovrebbe avere almeno una certa quantità minima di volume cubico.
nostro bus ha ora ora aderire a una nuova interfaccia denominata PersonalSpaceLaw
che è distinto da una qualsiasi delle altre interfacce che implementa già
//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
}
La funzionalità è stata estesa senza modificare le classi principali o core gerarchie. Questa implementazione è molto più pulita, facilmente estendibile e può adattarsi meglio alle mutevoli esigenze dei requisiti del progetto.
Ecco la full working program in Go Playground
L'articolo termina con la citazione di John Asmuth dal dal thread sulla produttività delle interfacce in Go:
"E 'il fatto che non lo faccio passare del tempo a progettare una sorta di gerarchia di tipi e poi riorganizzarla due o tre volte prima di finire.
Non è nemmeno il fatto che sia facile farlo bene -
è il fatto che non devo preoccuparmene e posso andare avanti con l'algoritmo attuale. "
alcune risorse che potrebbero aiutare:. Https://gobyexample.com/interfaces + http: //www.laktek. com/2012/02/13/learning-go-interfaces-reflections/+ http://golangtutorials.blogspot.com.au/2011/06/interfaces-in-go.html – elithrar