Sobes.tech
Middle+

Koji su načini za pisanje opšteg koda u Go?

sobes.tech АИ

Одговор од АИ

U jeziku Go, sledeći su glavni načini za pisanje generičkog koda:

  • Interfejsi: Omogućavaju pisanje funkcija koje rade sa bilo kojim tipom koji zadovoljava određeni skup metoda.

    // Definisanje interfejsa Reader
    type Reader interface {
        Read(p []byte) (n int, err error)
    }
    
    // Funkcija koja radi sa bilo kojim tipom koji implementira Reader
    func ProcessData(r Reader) error {
        // čitanje podataka iz Reader
        return nil
    }
    
  • Prazan interfejs (interface{}): Univerzalni tip koji može predstavljati bilo koju vrednost. Zahteva konverziju tipa pre korišćenja.

    func PrintAnything(v interface{}) {
        // Provera i konverzija tipa
        if s, ok := v.(string); ok {
            fmt.Println("Ovo je niz:", s)
        } else if i, ok := v.(int); ok {
            fmt.Println("Ovo je ceo broj:", i)
        }
    }
    
  • Generici / Tipovi sa parametrima (type parameters): Omogućavaju pisanje funkcija i tipova koji rade sa proizvoljnim skupovima tipova, navedenim pri deklaraciji. Dodato u Go 1.18.

    // Funkcija koja radi sa slice-ovima bilo kog tipa T
    func PrintSlice[T any](s []T) {
        for _, v := range s {
            fmt.Println(v)
        }
    }
    
    // Opšti tip Pair sa parametrima T1 i T2
    type Pair[T1, T2 any] struct {
        First T1
        Second T2
    }
    
  • Refleksija (reflect): Omogućava istraživanje i interakciju sa tipovima i vrednostima tokom izvršavanja. Često se koristi za složenije scenarije, ali može biti manje efikasna i sigurnija od drugih pristupa.

    import "reflect"
    
    func GetTypeName(v interface{}) string {
        return reflect.TypeOf(v).Name()
    }
    

Izbor metode zavisi od konkretne zadatka i potrebnog nivoa fleksibilnosti i performansi. Generici su preferirani način za kreiranje opštih algoritama i struktura podataka u savremenom Go. Interfejsi ostaju ključni mehanizam za polimorfizam i definisanje ponašanja. Prazan interfejs i refleksija se ređe koriste, za specifičnije slučajeve.