这个:
go run .source.go
产生以下错误:
软件包命令行参数:...中没有 Go 文件
如果我从文件名中删除初始点,它就可以正常工作。
“Go 文件”的定义是什么?为什么隐藏的 Go 文件不是 Go 文件?
这也很好用:
go run ·source.go
.
和 _
字符作为 Go 包中源文件的第一个字符无效,在导入该包时将被跳过。 文档具有权威性:
以“.”开头的目录和文件名或“_”被 go 工具忽略,名为“testdata”的目录也是如此。
Import
函数,它负责加载 Go 包,也是 no Go files in...
错误的来源。它负责确定文件系统中的哪些文件应形成一个包。注释中描述了加载包时会跳过以下类型的文件:
// In the directory containing the package, .go, .c, .h, and .s files are
// considered part of the package except for:
//
// - .go files in package documentation
// - files starting with _ or . (likely editor temporary files)
// - files with build constraints not satisfied by the context
no Go files
错误如果您对 Go 工具链的内部工作原理感兴趣,则在不存在源文件时看到的错误来源如下:
Import
例程返回错误类型build.NoGoError
。
中的 load.(*Package).setLoadPackageDataError
类型替换。此错误类型根据
Package
返回的 Import
信息,向用户提供更友好的信息,准确说明错误所在;例如,它会检查
Package
以在以下情况下提供不同的错误消息:
.
字符开头。这可能是一个战略选择,因为预期此类文件可能是编辑器生成的临时文件,因此,尽管不存在问题,但在使用工具链时,这些警告在常见情况下会经常出现。 Go 工具通常遵循谨慎的理念,仅在问题可操作、有意义且实际错误时才报告问题,而不是可能不相关的警告。
SafeArg
方法
Import
例程施加的约束要少,因为该函数必须处理 Go 工具链的多种类型的参数。此外,它允许参数的第一个字符是
.
,因为这确保其他目录的路径可以传递给命令,例如
./main.go
或
../main.go
。这在
SafeArg
的评论中指出:
// We accept leading . _ and / as likely in file system paths.