如果您知道要返回的类型,您还会使用输出参数吗?

xan*_*rus 1 go

许多 Go 代码使用以下模式:

var foo Foo
err := db.LoadFooByID(id, &foo)
// use the loaded foo
Run Code Online (Sandbox Code Playgroud)

这种模式有其优点,特别是当涉及到您事先不知道的类型时 ( interface{})。但是,如果您已经知道该类型,无论是任何其他语言,您都可以LoadFooByID像这样使用:

foo, err := db.LoadFooByID(id)
// use the loaded foo
Run Code Online (Sandbox Code Playgroud)

然而,人们仍然更喜欢前一种模式。

我知道这个问题非常主观,但如果您必须提供一种通用案例解决方案,并在代码库(对于已知类型)中一致应用,您会选择哪一个?

icz*_*cza 6

在第一种采用指针的形式中,您可以重用现有Foo变量,从而防止生成“垃圾”。对于单个 s 来说并不重要Foo,但是如果您Foo在循环中加载 s ,则可能会有所不同:您可以Foo在所有迭代中使用单个变量。

如果您有第一种形式,您始终可以创建一个提供第二种形式功能的辅助函数:

func loadFooById(id int) (*Foo, error) {
    var foo Foo
    err := db.LoadFooByID(id, &foo)
    return &foo, err
}
Run Code Online (Sandbox Code Playgroud)

如果您有第二种形式,则无法将其“转换”为第一种形式:如果该LoadFooByID()函数是分配新的函数Foo,则无法使其重用现有的形式。