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

Variables 为什么Go允许编译未使用的函数参数?,variables,parameters,compilation,go,Variables,Parameters,Compilation,Go,当Go来自C时,其中一个更值得注意的方面是,如果其中声明了一个未使用的变量,编译器将不会构建您的程序。那么,如果函数中声明了一个未使用的参数,那么为什么要构建这个程序呢 func main() { print(computron(3, -3)); } func computron(param_a int, param_b int) int { return 3 * param_a; } 没有官方理由,但在golang nuts上给出的理由是: 未使用的变量总是编程错误,而这

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

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


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

没有官方理由,但在golang nuts上给出的理由是:

未使用的变量总是编程错误,而这是常见的 编写一个不使用所有参数的函数

我们可以不命名这些参数(使用x),但那样的话可能会 与以下函数混淆

func-foo(u-string,u-int)//这应该做什么

这些名称即使未使用,也提供了重要的文档

安德鲁

有时,拥有未使用的参数对于满足接口很重要,一个例子可能是在加权图上操作的函数。如果想要在所有边上实现一个具有统一成本的图,那么考虑节点:

是没有用的。
func (graph *MyGraph) Distance(node1,node2 Node) int {
    return 1
}
正如该线程所指出的,有一个有效的参数仅允许名为
\uu
的参数未使用(例如
距离(\uu,\unode)
),但此时,由于存在错误,已经太晚了。正如也提到的那样,无论如何,一个可能的反对意见是参数,即使未使用,也可以隐式地提供文档


简言之:没有具体、具体的答案,除了他们只是做出了一个最终的武断(但仍然受过教育)的决定,即未使用的参数比未使用的局部变量和导入更重要、更有用。如果曾经有一个强大的设计原因,那么它在任何地方都没有被记录。

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

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

另一个原因是提供向前兼容性。如果释放库,在不破坏向后兼容性的情况下,无法更改或扩展参数列表(在Go中,没有函数重载:如果需要两个具有不同参数的变体,它们的名称也必须不同)

您可以提供导出的函数或方法,并向其中添加额外的-尚未使用的-或可选参数(例如提示),以便在未来版本/发布的库中使用它们

尽早这样做将使您受益,使用您的库的其他人不必更改他们代码中的任何内容

让我们看一个例子:

您想创建一个格式化函数:

// 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
}
const(

FlagAutoUnit=1我同意。有时您需要使用未使用的参数来实现一个函数,以满足接口的要求。我得到了它-第一类函数和类型函数。很酷!这似乎很容易被一个类似于@jrodman建议的习惯用法
\uuu=node1\u=node2
的习惯用法所涵盖(像
\uu=node1
\u=node2
)这样的单独行对我来说似乎更好,因为一旦学会了,它会明确地将“这是故意未使用的”和“这是意外未使用的”区分开来。后者可能发生在笨拙的维护期间,并且有一个明确的编程习惯用法让人们明确地确认是很好的“我实际上是有意让它不用的”,如果只是防止意外的隐式案例,那就更好了。