我可以为函数的 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 assignable到bar()
的参数类型,而foo()
的匿名结构return类型可分配给foo()
的匿名结构参数bar()
.
如果你需要它是动态的(例如 foo()
的结果类型在重新生成时可能会改变),你可以使用 go/parser
包来解析生成的源,并生成 bar()
具有相同的参数类型,当 go generate
为 运行 时惯用地执行。您应该将此部分作为生成/更改 foo
的生成过程的一部分,因此 foo
和 bar
将同步。
我有一个 return 匿名结构的函数。此函数已生成,因此我无法更改代码或为 return 值创建类型。
func foo() struct {
Prop int
} {
result := new(struct {
Prop int
})
result.Prop = 1
return *result
}
在代码库的其他地方,我想定义一个函数,bar()
,它接受 foo()
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 assignable到bar()
的参数类型,而foo()
的匿名结构return类型可分配给foo()
的匿名结构参数bar()
.
如果你需要它是动态的(例如 foo()
的结果类型在重新生成时可能会改变),你可以使用 go/parser
包来解析生成的源,并生成 bar()
具有相同的参数类型,当 go generate
为 运行 时惯用地执行。您应该将此部分作为生成/更改 foo
的生成过程的一部分,因此 foo
和 bar
将同步。