将函数分配给返回接口值的函数类型,

时间:2018-05-02 21:33:25

标签: go

我试图定义几个接口来重构一些代码,我遇到的问题是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)
    }

main / sub

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 :(得分:4)

根据Go assignability rules,仅当变量的类型f完全匹配时,函数v才可分配给变量T f的签名。

在一些其他语言中分配更具体类型的能力称为"协方差"和Go的类型系统没有它。

答案 1 :(得分:4)

由于签名不匹配而发生此错误。 您共享的代码是:

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

所以你需要用Gettable替换MyStruct。

//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