我有两个函数,它们返回指向符合同一接口的两个独立结构的指针。如何将功能放在同一张地图中?我想出了创建包装函数(在示例中为getFooer
)以进行类型检查的过程。有没有更好的办法?
getFooer
函数中的类型转换,而不检查main
中注释行中的类型转换?
package main
import (
"fmt"
)
type Fooer interface {
Foo()
}
type A struct {
}
func (a *A) Foo() {
}
var a A = A{}
func getA() (*A) {
return &a
}
func getFooer() (Fooer) {
return getA()
}
func main() {
var f func() (Fooer)
// f = getA // /tmp/foo.go:29:7: cannot use getA (type func() *A) as type func() Fooer in assignment
f = getFooer
fmt.Println(f)
}
答案 0 :(得分:1)
如何将功能放在同一张地图上?
您不能,它们具有不同的类型。
我想出了创建包装函数(在示例中为getFooer)来进行类型检查的方法。有更好的方法吗?
基本上:否。您可以修改例如getA到getA() Fooer
,但是如果需要A,则需要将类型断言返回给*A
。
使类型检查getFooer函数中的类型转换但不检查main注释行中的类型转换的规则是什么?
死法简单:函数getA() *A
的类型为func() *A
,并且此类型不同于func() Fooer
(无协方差)。 Functin类型必须匹配 literally 。您可以将*A
作为Fooer
返回,因为您可以将*A
分配给类型Fooer
的变量。 getA产生*A
,并将此*A
分配给getFooer
的返回值Fooer
。