为什么Go允许编译未使用的函数参数?

时间:2014-03-21 02:48:57

标签: variables parameters compilation go

来自C的Go中一个比较值得注意的方面是,如果在其中声明了未使用的变量,编译器将不会构建您的程序。那么,如果在函数中声明了未使用的参数,那么为什么要构建这个程序呢?

func main() {
    print(computron(3, -3));
}


func computron(param_a int, param_b int) int {
    return 3 * param_a;
}

3 个答案:

答案 0 :(得分:23)

没有官方的理由,但是关于golang-nuts的理由是:

  

未使用的变量始终是编程错误,而它很常见   编写一个不使用其所有参数的函数。

     

可以将这些参数保留为未命名(使用_),但随后可能会这样做   与

等功能混淆      

func foo(_ string,_ int)//这应该做什么?

     

这些名称即使未被使用,也会提供重要文件。

     

安德鲁

https://groups.google.com/forum/#!topic/golang-nuts/q09H61oxwWw

有时使用未使用的参数对于满足接口很重要,一个示例可能是在加权图上运行的函数。如果您想在所有边缘实施具有统一成本的图表,那么考虑节点是没有用的:

func (graph *MyGraph) Distance(node1,node2 Node) int {
    return 1
}

正如该线程所指出的那样,有一个有效的参数只允许名为_的参数,如果它们未被使用(例如Distance(_,_ Node)),但此时它也是如此迟到了Go 1 future-compatibility guarantee。正如提到的那样,无论如何可能的反对意见是参数,即使未使用,也可以隐含地提供文档。

简而言之:除了他们只是最终任意(但仍然受过教育)确定未使用的参数比未使用的局部变量和导入更重要和有用之外,没有具体的具体答案。如果曾经有一个强烈的设计理由,那么它没有记录在任何地方。

答案 1 :(得分:0)

主要原因是能够实现使用特定参数指定特定方法的接口,即使您未在实现中使用所有这些参数。这在@ Jsor的回答中有详细说明。

另一个很好的理由是,未使用的(本地)变量通常是错误或使用语言功能的结果(例如在一个块中使用短变量声明:=,无意中隐藏了一个"外部"变量)而未使用的函数参数从不(或很少)是错误的结果。

另一个原因可能是提供转发兼容性。如果您发布了库,则无法在不破坏向后兼容性的情况下更改或扩展参数列表(在Go中没有函数重载:如果您想要2个具有不同参数的变体,它们的名称也必须不同)。 / p>

您可以提供一个导出的函数或方法,并添加额外的 - 尚未使用的 - 或可选参数(例如提示),以便您可以在将来的版本/版本中使用它们。你的图书馆。

尽早这样做可以让您使用图书馆的其他人不必更改代码中的任何内容。

让我们看一个例子:

您想要创建格式化功能:

// FormatSize formats the specified size (bytes) to a string.
func FormatSize(size int) string {
    return fmt.Sprintf("%d bytes", size)
}

你也可以马上添加一个额外的参数:

// FormatSize formats the specified size (bytes) to a string.
// flags can be used to alter the output format. Not yet used.
func FormatSize(size int, flags int) string {
    return fmt.Sprintf("%d bytes", size)
}

之后您可以改进库和FormatSize()函数以支持以下格式化标记:

const (
    FlagAutoUnit      = 1 << iota // Automatically format as KB, MB, GB etc.
    FlagSI                        // Use SI conversion (1000 instead of 1024)
    FlagGroupDecimals             // Format number using decimal grouping
)

// FormatSize formats the specified size (bytes) to a string.
// flags can be used to alter the output format.
func FormatSize(size int, flags int) string {
    var s string

    // Check flags and format accordingly
    // ...

    return s
}

答案 2 :(得分:0)

如果您想在Go代码中找到未使用的参数,则可能需要使用linter:https://github.com/mvdan/unparam