Middle
Kuidas erineb Go liides teistest programmeerimiskeeltest liidestest?
sobes.tech AI
Vastus AI-lt
Go liidesteede peamine erinevus seisneb selles, et need realiseeritakse implitsiitselt (kaudselt).
Teistes keeltes (näiteks Java, C#) peab klass selgelt deklareerima, et ta implements teatud liidese (väljaütlemise realiseerimine).
Go-s vastab iga tüüp automaatselt liidesele, kui ta realiseerib kõik selle liidese määratletud meetodid. Selget realiseerimise deklareerimist ei ole vaja.
Näide (Go):
// Liidese defineerimine
type Reader interface {
Read(p []byte) (n int, err error)
}
// Struktuuri defineerimine
type FileReader struct {
// ... väljad
}
// Meetodi Read realiseerimine FileReader jaoks
func (fr FileReader) Read(p []byte) (n int, err error) {
// ... lugemisloogika
return 0, nil // näidis
}
// FileReader vastab kaudselt liidesele,
// kuna tal on sobiv meetod Read.
Näide (Java - võrdluseks):
// Liidese defineerimine
interface Reader {
int read(byte[] p);
}
// Klastri defineerimine
class FileReader implements Reader { // Selge realiseerimise deklareerimine
// ... väljad
@Override
public int read(byte[] p) {
// ... lugemisloogika
return 0; // näidis
}
}
Go peamised implitsiitse realiseerimise eelised:
- Lahutatud disain: võimaldab uutel teekidel defineerida liideseid, mida juba olemasolevad tüübid saavad täita ilma nende muutmiseta.
- Paindlikkus: lihtsustab ühiste funktsioonide loomist, mis töötavad erinevate tüüpidega, mis vastavad ühele liidesele.
- "Implements"-i vajadus puudub: vähendab boilerplate-koodi.
- Partiidüüping ("duck typing"): Kui tüüp näeb välja nagu part ja krookib nagu part, siis ta on part. Sellisel juhul - kui tüüp realiseerib liidese meetodid, saab seda kasutada selle liidese jaoks.