Golang: рекурсивное назначение интерфейса - PullRequest
0 голосов
/ 20 апреля 2020

Я тестирую включение типа интерфейса в качестве поля, когда этот тип уже реализует этот интерфейс. Ниже приведен код, который я тестирую:

package main

import (
    "fmt"
)

type AInterface interface {
    SayHi()
}

type Foo struct {
    Name string
    AInterface
}

func (f Foo) SayHi() {
    fmt.Printf("Hi I'm %s\n", f.Name)
}

func main() {
    foo := Foo{}
    foo.Name = "foo"
    foo.AInterface = &foo
    foo.SayHi()
    foo.AInterface.SayHi()
}

Вы можете видеть, что выделение кода Foo включает в себя AInterface в качестве поля, и оно присваивается этому полю в foo.AInterface = &foo.

Это при работе на MacOS 10.15.3 и go version go1.14.2 darwin/amd64 работает. Выполнение go build или CGO_ENABLED=0 GOOS=linux go build завершается успешно, а выполнение go run main.go дает:

Hi I'm foo
Hi I'm foo

Ожидаемый результат. Тем не менее, когда я копирую и вставляю точный код в Go Playground, иногда происходит сбой сборки из-за ошибки тайм-аута. См. здесь .

Сейчас я не могу воспроизвести эту ошибку, но я был в состоянии воспроизвести ее последовательно. Каким-то образом сбой просто исчез за одну ночь.

Итак, мой вопрос

  1. Почему разница в поведении на Go Playground?

  2. Что не так с этой реализацией, если таковая имеется? Это просто не рекомендуется? Можете ли вы найти какие-либо структурные проблемы с ним?

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