Sobes.tech
Senior
38

Go-де Java сияқты мұрагерлік жоқ. Java-дан тәжірибесі бар жас маманға Go-да кодты қайта пайдалану қалай түсіндірер едіңіз және ол неге жақсы болуы мүмкін?

Сұралған компаниялар
Spectr

AI-дан жауап

sobes.tech AI

Go тілінде Java-дағыдай классикалық мұрагерлік жоқ, яғни бір класс басқа бір классты кеңейтпейді. Оның орнына Go композиция мен интерфейстерді кодты қайта пайдалану үшін қолданады.

Композиция — бұл бір құрылым басқа бір құрылымды өріс ретінде қамтиды, осылайша оның функционалдығын "енгізеді". Бұл күрделі типтерді қарапайымдардан құруға мүмкіндік береді, қатты иерархияны болдырмайды.

Интерфейстер Go-да мінез-құлықты сипаттайды (әдістер жиынтығы), ал құрылымды емес. Әрбір тип, интерфейстегі әдістерді жүзеге асырса, автоматты түрде сол интерфейсті қанағаттандырады, айқын жариялаусыз.

Неліктен бұл жақсы:

  • Икемділік: әртүрлі мінез-құлықтарды күрделі иерархиясыз біріктіруге болады.
  • Қарапайымдылық: типтер арасындағы байланыстар азаяды, түсінуді және тестілеуді жеңілдетеді.
  • Көп мұрагерліктің болмауы: Java-да ол тыйым салынған, ал Go композицияны табиғи түрде шешеді.

Композиция мысалы:

package main
import "fmt"

type Logger struct {}

func (l Logger) Log(msg string) {
    fmt.Println("Log:", msg)
}

type Service struct {
    Logger // Logger-ды енгіземіз
}

func (s Service) DoWork() {
    s.Log("Жұмыс басталды")
    // ...
    s.Log("Жұмыс аяқталды")
}

func main() {
    svc := Service{}
    svc.DoWork()
}

Мұнда Service Logger-ды мұрагерлікке алмайды, оны жай ғана қамтиды, осылайша Log әдісіне қол жеткізеді. Бұл тәсіл мұрагерліктен қарапайым әрі айқын, себебі ол одан да түсінікті.