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