Методы отправки с использованием интерфейса в Go - PullRequest
0 голосов
/ 22 апреля 2020

Как на самом деле методы в Go отправляются, если мы используем интерфейс, stati c (время компиляции) или динамический c (время выполнения). Давайте рассмотрим этот код:

package main

import "fmt"

type ICat interface {
    Meow()
    Walk()
    Run()
}
func NewCat(name string) ICat {
    return &cat{
        name:name,
    }
}
type cat struct {
    name string
}
func (c *cat) Meow() {
    fmt.Print("Meowwwwwwwww")
}
func (c *cat) Walk() {
    fmt.Print("Walk")
}
func (c *cat) Run() {
    fmt.Print("Run")
}


type IAnimal interface{
    DoSound()
}
type animal struct {
    cat ICat
}
func New() IAnimal {
    return &animal{
        cat:NewCat("bobby"),
    }
}
func (a *animal) DoSound() {
    a.cat.Meow()
}


func main() {
    i := New()
    i.DoSound()
}

Go Детская площадка: https://play.golang.org/p/RzipDT6FAC9

Как на самом деле эти методы, определенные в этих интерфейсах, были отправлены? Я использую этот стиль разработки для реализации разделения интерфейса и разделения внимания между данными и поведением. Мое другое беспокойство - перф. Некоторые сказали, что он статически отправляется во время компиляции, в то время как другие говорили, что он динамически отправляется во время выполнения.

1 Ответ

0 голосов
/ 22 апреля 2020

Мы не можем знать во время компиляции, каким будет тип интерфейса типа Dynami c. Для вызова через интерфейс необходимо использовать dynamici c dispatch . Вместо прямого вызова компилятор должен сгенерировать код для получения адреса метода из дескриптора типа, а затем сделать косвенный вызов этого адреса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...