2013-07-01 4 views
1

Пример ошибки @ play.golang.org: http://play.golang.org/p/GRoqRHnTj6Ошибка при возвращении обратного вызова, который возвращает соответствующий тип интерфейса

Следующий код возвращает «prog.go: 16: не может использовать NewMyGame (тип FUNC() MyGame) как type func() Воспроизводимый в аргументе return ", хотя интерфейс полностью пуст. Пожалуйста, найдите также код, приведенный ниже, я полностью разочарован, и любая помощь будет чрезвычайно оценена.

package main 

// Define an arbitrary game type 
type MyGame struct{} 

// Create a constructor function for arbitrary game type 
func NewMyGame() MyGame { 
    return MyGame{} 
} 

// Define an interface defining game types 
type Playable interface{} 

// In my app it will return a list of constructors matching interface 
func Playables() func() Playable { 
    return NewMyGame 
} 

func main() {} 

ответ

1

Это точно так, как говорит ошибка,

cannot use NewMyGame (type func() MyGame) as type func() Playable 

Простое исправление будет

func Playables() func() Playable { 
    return func() (Playable) { 
     return NewMyGame() 
    } 
} 
+0

Спасибо за ваш ответ, ответ имеет смысл, и на самом деле работает для меня в моем приложении , Вы не узнаете, почему требования к интерфейсу связи не будут возможны на уровне сигнатуры обратного вызова, но работает, когда вы завершаете вызов конструктора в другом обратном вызове? – beefsack

+1

@beefsack Это потому, что типы в Go довольно конкретны. Найдите вокруг вопросов о срезах интерфейсов. Это также имеет значение, потому что интерфейсы в основном представляют собой 2-х указательный блок, который изменяет размер возвращаемого значения. – cthom06

Смежные вопросы