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
}