go代码的文件名字为template_test.go运行报错如下:
The 'main' file has the non-main package or does not contain the 'main' function
cmd中运行报错为:
其实这个错误的原因就是go对代码文件名有限制,TNN的不能用*_test.go
将_test删除之后就可以执行了,只是报的错误莫名其妙,代码中package main func main()声明一样不缺,报的错误莫名其妙;
package main
import (
"fmt"
"os"
"text/template"
)
type Person struct {
Name string
Age int
}
func main() {
// 定义模板字符串
tpl := `Hello, my name is {{.Name}} and I am {{.Age}} years old.`
// 创建模板对象
tmpl, err := template.New("test").Parse(tpl)
if err != nil {
fmt.Println("Error parsing template:", err)
return
}
// 定义数据
person := Person{
Name: "John",
Age: 30,
}
// 执行模板并输出结果
err = tmpl.Execute(os.Stdout, person)
if err != nil {
fmt.Println("Error executing template:", err)
}
}
在 Go 语言里,除了 _test.go
被用作测试文件的命名约定外,还存在其他一些文件名相关的约定和限制,下面为你详细介绍:
1. 构建标签文件名
- 用途:构建标签是用来指定在特定条件下才编译某些 Go 文件的一种机制。文件名可以包含构建标签信息,从而决定该文件是否参与编译。
- 示例:若文件名为
example_linux.go
,这表明该文件仅在 Linux 系统下编译。这里的_linux
就是一个构建标签,类似的还有_windows
、_darwin
等,分别对应 Windows 和 macOS 系统。 - 规则:构建标签通常以
_
开头,后面跟着操作系统名、架构名或者自定义的构建标签名。
2. 生成文件的命名约定
- 用途:当使用代码生成工具(像
go generate
)生成代码时,生成的文件通常会有特定的命名约定,以便和手动编写的代码区分开来。 - 示例:文件名中包含
_gen.go
或者_generated.go
等后缀,表明该文件是自动生成的。例如example_gen.go
,一看就知道这是通过代码生成工具生成的文件。
3. 包文档文件名
- 用途:如果要为一个包编写文档,通常会使用
doc.go
作为文件名。该文件主要用于包含包级别的注释和文档说明。 - 示例:在一个包目录下,
doc.go
文件可以包含对整个包的功能、使用方法、注意事项等方面的详细说明。
4. 内部包文件名
- 用途:Go 语言里的内部包(internal package)是一种特殊的包,只能被同一模块内的其他包导入。内部包的目录名必须包含
internal
这个名称,而文件名则遵循一般的命名规则。 - 示例:例如
project/internal/utils/utils.go
,这里的utils
包就是一个内部包,只能被project
模块内的其他包导入。
5. 普通文件名的一般性建议
- 字符限制:虽然 Go 语言本身对文件名的字符没有严格限制,但为了保证在不同操作系统和环境下的兼容性,建议文件名仅使用字母(
a - z
、A - Z
)、数字(0 - 9
)、下划线(_
)和连字符(-
)。 - 大小写敏感:Go 是大小写敏感的语言,不过为了保持代码的一致性和可读性,建议文件名使用小写字母,并且使用下划线来分隔单词,比如
user_service.go
。