【问题标题】:Why Does Golang Allow Compilation of Unused Functions?为什么 Golang 允许编译未使用的函数?
【发布时间】:2015-09-14 12:33:25
【问题描述】:

可以检测到未使用的私有/未导出函数。为什么编译器不像未使用的变量那样抱怨?

编辑:这个问题也适用于未使用的私有类型/接口。

【问题讨论】:

  • 因为它们可以被删除而没有副作用(init 除外,它总是运行)。变量较少,因为它们的实例化可能有副作用。此外,允许在包级别使用未使用的变量。
  • 我认为他们这样做是为了保持代码干净,不仅是为了避免副作用(即分配)
  • 未使用的类型(接口、结构)也不是错误。我认为唯一真正的答案是,虽然程序员可以合理地避免未使用的局部变量和导入,但如果您永远无法编译未使用的辅助函数或类型,那么构建任何东西都太困难了。
  • 我也想知道为什么未使用的函数参数不会被标记为错误,但我认为显然必须这样才能使类型满足接口,即使它不需要所有参数某种方法。
  • @rob74 我实际上写了一个关于那个的答案:stackoverflow.com/questions/22549228/…

标签: go


【解决方案1】:

我相信这是范围和默认接口 {} 的组合。

这与您可以在未使用的包级别声明一个变量并且代码可以正常构建的原因相同。

这个 sn-p 是完全有效的 go 代码:

package main
import (
  "fmt"
  "time"
)

var (
  testVar = "sup"
)

func main() {
  start := time.Now()

  fmt.Println("This sure was a test")

  //Mon Jan 2 15:04:05 -0700 MST 2006
  fmt.Println("Finished!\nTimeElapsed:", time.Since(start))
}

即使变量testVar从未被使用过。

这里有几个相关的问题,我认为它们都有相同的一般答案。

  • 为什么不允许使用未使用的变量?
  • 如果未使用的变量不允许使用,为什么还允许使用未使用的函数参数?
  • 为什么允许使用未使用的函数/结构?

...

一般的答案是,函数范围内未使用的变量总是浪费编译器时间,或者是一个合法的错误 - 所以它们是严格不允许的。

但是,未使用的函数参数以及私有结构和函数可能满足接口。至少它们都满足默认接口 {}。因此,它们根本不能保证是错误的..

似乎没有任何官方文档概述了 golang 哲学这个特定角落背后的推理,但正如 the answer to a similar question 中指出的那样,您可能会更幸运地在 golang-nuts forum 上找到答案和提问。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2016-10-25
    • 2020-02-15
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多