将类型为“函数返回指针的接口”分配给“函数的返回函数的指针”

时间:2020-02-26 10:03:04

标签: go

我有两个函数,它们返回指向符合同一接口的两个独立结构的指针。如何将功能放在同一张地图中?我想出了创建包装函数(在示例中为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)
}

1 个答案:

答案 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