'package'关键字的目的是什么,可以由编译器推断出来?

mah*_*dix 2 packages go

目录中的所有Go源文件x都x在顶部声明了包名.我知道这不是强制性的,否则会使事情变得不必要地复杂化.那么为什么go编译器不会从目录名中推断出包名?

这存在于几乎许多其他语言中,如Java或C#,您必须在编译时声明可以轻松计算的内容.

理由是什么?

Cal*_*leb 5

没有package你将无法区分主程序和库.

此外,根据语言规范,该语言不要求包与目录相同:

实现可能要求包的所有源文件都位于同一目录中.

实际上,某些包的名称与其导入路径不同:

如果省略PackageName,则默认为导入包的package子句中指定的标识符.

考虑github.com/google/go-gcm,其中包含package gcm文件.使用此库的项目将具有:

import "github.com/google/go-gcm"
Run Code Online (Sandbox Code Playgroud)

然后调用这样的事情:

res, err := gcm.SendHttp(APIKey, notification)
Run Code Online (Sandbox Code Playgroud)

这种情况特别常见,-因为您无法在标识符中使用它.