我可以为函数的 return 类型起别名吗

Can I alias the return type of a fuction

我有一个 return 匿名结构的函数。此函数已生成,因此我无法更改代码或为 return 值创建类型。

func foo() struct {
    Prop int
} {
    result := new(struct {
        Prop int
    })
    result.Prop = 1
    return *result
}

在代码库的其他地方,我想定义一个函数,bar(),它接受 foo()

的 return 类型作为参数
func bar(arg ReturnTypeOfFoo) {
    // ...
}

我可以在不手动定义 ReturnTypeOfFoo 类型的情况下执行此操作吗?我可以在 foo() 上做一些反思吗?

Can I do this without manually defining the ReturnTypeOfFoo type?

不,因为...

Is there some kind of reflection I can do on foo()?

没有。您不能在编译时使用反射。

您可以使用相同的匿名结构作为 bar() 的参数类型:

func bar(arg struct {
    Prop int
}) {
    fmt.Printf("Received: %+v\n", arg)
}

那么下面是有效代码:

res := foo()
bar(res)

并输出(在 Go Playground 上尝试):

Received: {Prop:1}

这是可能的,因为call bar(res) is valid if all arguments are assignablebar()的参数类型,而foo()的匿名结构return类型可分配给foo()的匿名结构参数bar().

如果你需要它是动态的(例如 foo() 的结果类型在重新生成时可能会改变),你可以使用 go/parser 包来解析生成的源,并生成 bar() 具有相同的参数类型,当 go generate 为 运行 时惯用地执行。您应该将此部分作为生成/更改 foo 的生成过程的一部分,因此 foobar 将同步。