Sobes.tech
Junior — Middle

Компилятор кай жана кандай конкреттүү ыкманы чакырууну аныктайт, эгерде жүктөө же кайра аныктоо болсо?

sobes.tech AI

AIден жооп

Go тилинде ыктымалдуу ыкмаларды жүктөө классикалык мааниде, C++ же Java сыяктуу, жок. Ар бир ыкма же функция пакеттер ичинде уникалдуу аталышка ээ. Эгер бир эле аталышта, бирок ар башка параметрлер менен бир нече функция болсо, бул компиляция катасына алып келет.

Кайра аныктоо жөнүндө айтканда, Go интерфейстерди колдонуп: эгер бир түр интерфейсинин ыкмаларын ишке ашырса, интерфейс аркылуу чакырганда, конкреттүү түрдүн ыкмасы чакырылат.

Ошентип, ыкманын тандалышы компиляция учурунда функциянын аты жана сигнатурасына негизделет, жана динамикалык чакыруу интерфейс аркылуу, объекттин түрүнө жараша аныкталат.

Мисал:

package main
import "fmt"

type Speaker interface {
    Speak()
}

type Dog struct{}
func (d Dog) Speak() { fmt.Println("Woof") }

type Cat struct{}
func (c Cat) Speak() { fmt.Println("Meow") }

func main() {
    var s Speaker
    s = Dog{}
    s.Speak() // Woof чыгарат
    s = Cat{}
    s.Speak() // Meow чыгарат
}