当前位置: 首页 > 面试题库 >

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

江建明
2023-03-14
问题内容

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

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


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

问题答案:

没有正式的原因,但是在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保证,
此时已为时已晚。由于
提到,一个可能的反对意见反正是参数,即使不使用,可以隐提供的文档。

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



 类似资料:
  • 最近,我开始学习,并琢磨出函数可能是这样没有参数编写的: 这是怎么可能的,以及在引擎盖下正在做什么?不允许我们这样做。

  • 问题内容: 我刚接触PHP,但是多年来我一直在使用类似的语言进行编程。我被以下内容弄糊涂了: 它产生了语法错误:这就是调用。 但这很好用: 碰了一会儿之后,我被告知您不能在默认属性中调用函数。你必须在做。我的问题是:为什么?这是“功能”还是草率的实现?有什么根据? 问题答案: 编译器代码建议这是设计使然,尽管我不知道其背后的官方原因是什么。我也不确定要可靠地实现此功能需要花费多少精力,但是目前完成

  • 问题内容: 这与为什么为什么不接受(&)映射成员的地址而允许(&)slice元素相同?但我对接受的答案不满意:“切片由后备数组支持,而映射则不支持。” 注意:现在,我已对上面提到的问题添加了自己的答案。 Map中的Access Struct问题(不带复制)甚至更好,但是它被接受的答案是您不能修改map中的struct值字段,因为您无法获取其地址(这是我的问题)。 就像切片一样,映射由内存结构(可能

  • 这与我对“流减少不兼容类型”的回答有关。我不知道为什么我的建议有效,霍尔格正确地敦促我这一点。但即使是他似乎也没有一个明确的解释为什么它能起作用。所以,让我们把它作为自己的问题来问: 以下代码不能在中编译(下面指向ideone的链接是,请参阅http://ideone.com/faq): 这样做是正确的:或者将这个流中的两个谓词结合在一起,就像写: IdeOne演示 尽管事实上我想尝试这一点,但我

  • 今天我遇到了一些我不太理解的复制构造函数。 考虑下一个代码: 然后在将原点分配给复制时调用复制构造函数,这是有意义的。但是,如果我将复制的声明更改为 它不叫。即使当我使用< code>create()函数时,它也不会调用复制构造函数。但是,当将其更改为 它确实调用了复制构造函数。一些研究解释说,允许编译器优化复制构造函数,这听起来是件好事。直到复制构造函数是非默认的,因为那时它可能会,也可能不会做