Я тестирую включение типа интерфейса в качестве поля, когда этот тип уже реализует этот интерфейс. Ниже приведен код, который я тестирую:
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, иногда происходит сбой сборки из-за ошибки тайм-аута. См. здесь .
Сейчас я не могу воспроизвести эту ошибку, но я был в состоянии воспроизвести ее последовательно. Каким-то образом сбой просто исчез за одну ночь.
Итак, мой вопрос
Почему разница в поведении на Go Playground?
Что не так с этой реализацией, если таковая имеется? Это просто не рекомендуется? Можете ли вы найти какие-либо структурные проблемы с ним?