Sobes.tech
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.