1.大写相当于public
2.小写相当于private
注意:这个public和private是相对于包(go文件首行的package 后面跟的包名)来说的。
3.1这个包名相对于它所处的实际的文件系统目录有什么关系呢?有关系,一般这个包名和所在的目录名保持一致,这样容易辨认。但这种规定不是必然,比如我在src/aa/bb目录下新建了fab.go,我在fab.go开头就可以直接给包命名为package pab.
package pab
type (
EventObserver struct{
id int
}
EventNotifier struct{
ID int
}
event struct{
id int
}
)
func testAuthA(){
n := &event{id:1} // 在同一个包里即使是首字母小写,依然可以访问,struct里的属性小写,依然可以访问
}
func TestAuthB(){
}
3.2在import的时候,import的是文件所在目录,也就是实际的文件路径比如我在src/cc/dd目录下新建了fcd.go,我在要引用fab里的结构体,或者函数那么就要 import aa/bb 而不能import pab
package pcd
// import pab 错误
import aa/bb
func testAuth(){
//n := &pab.EventObserver{id:1} 会报错,id小写
n1 := &pab.EventNotifier{ID:1}
// pab.testAuthA() 错误,访问不到
pab.TestAuthB()
}
3.3两个Go文件在同一个目录里,不同的package名
测试在Goland里语法都不通过,不允许在同一个路径下,在不同Go文件里使用不同的包名
3.4两个Go文件在在不同的目录,同一个包名
测试和不同的目录,不同的包名效果一致
3.5两个Go文件在同一个目录,同一个包名
和在同一个Go文件里效果一致
总结:
1.首字母大写访问权限public,首字母小写访问权限private,这个权限针对的是文件所在的路径+文件的包名,完全一致可以忽略这个权限的访问控制(相当于在同一个Go文件里),有一个不一致就受到这个访问权限的限制。什么叫针对路径+包名呢?浅白的说,对比C++的类属性访问权限,在这个类里什么控制符都不妨碍类自己访问自己的属性,出了这个类就受到public,private的限制。同理,Go的访问权限,也是如此。在相同的路径+包名的情况下,不管结构体或者函数的首字母是大写还是小写,都在Go文件里可以访问。