предоставление функций типам функций, которые возвращают значения интерфейса, - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь определить пару интерфейсов для рефакторинга некоторого кода, и у меня возникает проблема, когда Go не позволяет мне назначать функции переменным. Это установка

main.go

    type Gettable interface {
        Get() int64
    }

    type MyFunction func(int64) (Gettable, error)

    func main() {

        var f MyFunction
        f = sub.TestFn2
        a, _ := f(1)
        fmt.Println(a)
    }

основной / суб

package sub

type MyStruct struct {
    Val int64
}

func (v MyStruct) Get() int64 {
    return v.Val
}

func TestFn2(a int64) (MyStruct, error) {
    return MyStruct{a}, nil
}

Я пытаюсь определить тип универсальной функции, а в подпакете создать конкретные функции

и в идеале я хочу сохранить функции на карте и вызывать их как-то так:

FnMap["fnName"]()

Я еще не там,

я получаю сообщение об ошибке

/topics.go:27:4: cannot use sub.TestFn2 (type func(int64) (sub.MyStruct, error)) as type MyFunction in assignment

но MyStruct четко реализует интерфейс Gettable

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Эта ошибка возникает из-за несоответствия подписи. Ваш общий код:

//shared code
//---------------------------------------------
type Gettable interface {
    Get() int64
}
type MyFunction func(int64) (Gettable, error)

Так что вам нужно заменить MyStruct на Gettable.

//main/sub
//---------------------------------------------
type MyStruct struct {
    Val int64
}

func (v MyStruct) Get() int64 {
    return v.Val
}

//this signature of TestFn2 is different of MyStruct
//-[TestFn2] func (a int64) (MyStruct, error)
//-[MyFunction] func(int64) (Gettable, error)
func TestFn2(a int64) (Gettable, error) {//<-- replace by Gettable here
    return MyStruct{a}, nil
}

Запуск вашего кода:

//main.go
//---------------------------------------------

func main() {
        var f MyFunction
        f = TestFn2
        a, _ := f(1)
        fmt.Println(a)
}   

Результат:

{1}

см. На детской площадке: https://play.golang.org/p/sRsXix8E_83

0 голосов
/ 03 мая 2018

Согласно правилам назначения Го функция f назначается переменной v, только если тип переменной T точно соответствует сигнатуре f.

Возможность назначать более конкретный тип в некоторых других языках, называемых "ковариация", и система типов Go не имеет его.

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