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

Ant*_*unt 8 go

可以检测到未使用的专用/未导出的功能.为什么编译器不会像未使用的变量那样抱怨?

编辑:该问题也适用于未使用的私有类型/接口.

Opn*_*cus 4

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

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

这个片段是完全有效的 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))
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

...

一般的答案是,函数范围内未使用的变量总是要么浪费编译器时间,要么产生合法错误 - 因此严格不允许使用它们。

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

似乎没有任何官方文档概述了 golang 哲学的这个特定角落背后的推理,但正如类似问题的答案中所指出的,您可能会更幸运地在golang-nuts 论坛上找到答案并提出问题。

希望这可以帮助!