在函数调用上定义golang结构的成本

时间:2019-01-17 13:48:51

标签: go struct type-declaration

我偶然发现了一个定义自己的请求和响应类型的函数。

func doSomething() {

    type request struct {
        resourceID string
    }

    type response struct {
        resourceContents *Data
    }

    request := initializeRequest()
    result := dispatchRequest(request)

    ...
}

我认为这具有在功能主体中记录请求和响应结构的巨大优势。当许多这样的函数在同一个文件中并且它们的请求和响应结构都具有不同的类型时,这样做的便利性尤其明显:在函数外部定义类型意味着我必须用不同的方式命名它们。

尽管如此,我仍然担心这样做的代价: 函数调用声明自己的类型比在包作用域中声明该类型要贵得多吗?

这种方法是惯用的吗?

1 个答案:

答案 0 :(得分:2)

类型是编译时的概念,它们的范围不会(通常)影响运行时的速度,因为在这种情况下,编译器生成的代码将忽略原始类型(有关更多信息,请参见Type erasure and reification),反射是异常值,但是您在这里没有反射。


也就是说,我觉得这段代码有点可疑:

request := initializeRequest()

initializeRequest在哪里定义?它必须知道request类型,所以我认为它也是函数内部的吗?否则代码将无法编译。这些考虑因素在很多情况下限制了函数局部结构的实用性,但是,如果您确实拥有所有局部函数,则我认为最好是尽可能地隐藏类型。

在较大规模的程序中,测试问题也将起作用。如果它们隐藏在范围内,您将如何测试在它们上面工作的类型和功能?