Go 文件的定义是什么?

问题描述 投票:0回答:1

这个:

go run .source.go

产生以下错误:

软件包命令行参数:...中没有 Go 文件

如果我从文件名中删除初始点,它就可以正常工作。

“Go 文件”的定义是什么?为什么隐藏的 Go 文件不是 Go 文件?

这也很好用:

go run ·source.go
go
1个回答
0
投票

.
_
字符作为 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.NoGoError

 中的 load.(*Package).setLoadPackageDataError
 类型
替换
。此错误类型根据 Package 返回的
Import
信息,向用户提供更友好的信息
,准确说明错误所在;例如,它会检查 
Package
 以在以下情况下提供不同的错误消息:

    由于构建限制,所有文件都被忽略
  • 仅存在 Go 测试文件,但调用的命令不关心它们
此命令不会专门报告文件在包导入中被跳过,因为它们以

.

 字符开头。这可能是一个战略选择,因为预期此类文件可能是编辑器生成的临时文件,因此,尽管不存在问题,但在使用工具链时,这些警告在常见情况下会经常出现。 Go 工具通常遵循谨慎的理念,仅在问题可操作、有意义且实际错误时才报告问题,而不是可能不相关的警告。


SafeArg
方法

在评论中,您

参考到一个单独的答案,描述了SafeArg

方法。

此方法用于过滤 Go 命令的命令行参数,以确定什么是“安全”的参数。该函数施加的约束比

Import

 例程施加的约束要少,因为该函数必须处理 Go 工具链的多种类型的参数。此外,它允许参数的第一个字符是 
.
,因为这确保其他目录的路径可以传递给命令,例如 
./main.go
../main.go
。这在
SafeArg
的评论中指出:

// We accept leading . _ and / as likely in file system paths.
    
© www.soinside.com 2019 - 2024. All rights reserved.