总结
包package,是代码组织的基本单位.
同一个包内的所有的文件,共享同一个命名空间, 即使这些文件可能不在同一个文件夹下,但是只要他们的package是一样的, 那么他们就是属于同一个命名空间.
他们中的变量是可以访问的,但是必须是大写开头的, 也就是可以导出的.
总结一下,只要结构体名首字母大写(导出),并且所有文件在同一个包内,就可以相互访问。
在 Go 语言中,如果两个 .go 文件不在同一个目录下,但它们的 package 声明是相同的,它们仍然属于同一个包。
然而,关于变量访问权限的规则仍然适用:只有以大写字母开头的变量(即导出的变量)才能在不同的文件中访问。
以下是详细解释:
- 包(Package) :在 Go 中,包是代码组织的基本单位。同一个包内的所有文件共享同一个命名空间。这意味着,如果两个文件声明了相同的包名,它们可以互相访问包内定义的变量、类型、函数等,但前提是这些变量、类型或函数是导出的(即名称首字母大写)。
- 导出规则:在 Go 中,要使得某个标识符(变量、类型、函数等)在包外可见,必须将其名称的首字母大写。这是 Go 的导出规则。如果标识符的首字母是小写的,那么它只能在定义它的文件或同一个包的其他文件中通过包名点标识符的方式访问(但仍然不能跨包访问,除非是通过导出的接口或函数间接访问)。
- 目录结构:虽然文件的目录结构会影响 Go 模块的导入路径,但它不影响包内文件的访问权限。只要两个
.go文件声明了相同的包名,无论它们位于哪个目录下(在同一模块内),它们都属于同一个包,并遵循上述的导出规则。
因此,如果两个 .go 文件不在同一个目录下,但它们的 package 声明是相同的,并且你试图访问一个小写字母定义的变量,那么这是不允许的。这个变量只能在定义它的文件或同一个包的其他文件中访问,但不能跨文件直接访问(除非是通过导出的接口或函数间接访问)。
如果你需要在不同的文件中访问某个变量,你应该将该变量的名称首字母大写,使其成为导出的变量。但是,请注意,过度导出变量可能会导致封装性降低和代码维护困难。通常,更好的做法是通过导出的函数或方法来提供对内部状态的访问和控制。