【问题标题】:Can I alias the return type of a fuction我可以给函数的返回类型取别名吗
【发布时间】:2021-04-13 09:29:46
【问题描述】:

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

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

在代码库的其他地方,我想定义一个函数bar(),它接受foo()的返回类型作为参数

func bar(arg ReturnTypeOfFoo) {
    // ...
}

我可以在不手动定义ReturnTypeOfFoo 类型的情况下执行此操作吗?我可以对foo() 进行某种反思吗?

【问题讨论】:

    标签: go reflection types


    【解决方案1】:

    您可以使用与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) 是有效的,如果所有参数都是assignablebar() 的参数类型,并且foo() 的匿名结构返回类型可分配给bar().

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

    【讨论】:

    • 添加第二代步骤是一个很好的建议。谢谢!
    【解决方案2】:

    我可以在不手动定义 ReturnTypeOfFoo 类型的情况下执行此操作吗?

    不,因为...

    我可以对 foo() 进行某种反思吗?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2021-01-31
      • 1970-01-01
      相关资源
      最近更新 更多