Vec*_*tor 41 private public access-modifiers case-sensitive go
来自Delphi的GoLang新手,C++:
我第一次尝试在Go中创建自己的包,我遵循了有关如何布局工作空间等的所有说明,但我一直在收到编译器错误:
./myPackage.go:52: undefined: myFunc
Run Code Online (Sandbox Code Playgroud)
稍微探讨一下后,我发现Go中的公共访问修饰符只需通过大写声明一个函数即可实现.大.
但是当我开始尝试容器类时 - List对于初学者,我发现我必须声明一个List引用返回值,如下所示:
func GetFactors(value *int64) *list.List {...
Run Code Online (Sandbox Code Playgroud)
*list 是小写的.
当我声明对列表的本地引用时 - 我必须使用:
l := list.New()
Run Code Online (Sandbox Code Playgroud)
再次,小写的list.
所以,我很困惑.规则是什么?列表调用和引用显然是公开的,或者我无法调用/使用它们 - 所以为什么它们是小写的?
Eve*_*man 46
在这种情况下,list是您要导入的包的名称import "container/list",其公共成员是大写的,如List.
规则是公共功能,类型等应该是大写的.
您可以根据需要为导入的包添加别名,但默认情况下,它只是包路径的最后一部分的名称 - 在本例中为list.
更新:这不是包路径的最后一部分.这是实际的包名(通常是相同的).
Von*_*onC 14
注意:从Go 1.5(2015年第2季度/第3季度)开始,您也将获得"受保护"导入(名为"内部")!
请参阅Go 1.4 doc:
Go的包系统可以很容易地将程序结构化为具有清晰边界的组件,但只有两种访问形式:本地(未导出)和全局(导出).
有时,人们希望拥有未导出的组件,例如,避免获取作为公共存储库一部分但不打算在其所属程序之外使用的代码的接口的客户端.Go语言没有强制执行这种区别的能力,但是从Go 1.4开始,该
go命令引入了一种机制来定义"内部"包,这些包可能不会被它们所在的源子树外的包导入.要创建此类包,请将其放在名为
internalinternal的目录或名为的目录的子目录中.
当go命令internal在其路径中看到导入包时,它会验证执行导入的程序包是否位于以内部目录的父目录为根的树中.
例如,.../a/b/c/internal/d/e/f只能通过以root为目录的目录树中的代码导入包.../a/b/c.
它不能由.../a/b/g任何其他存储库中的代码导入.对于Go 1.4,对主Go存储库强制执行内部包机制 ;
从1.5开始,将对任何存储库强制执行.
注意:包名称的Go Spec没有提到包名称始终为小写.
它仅声明其名称由标识符表示,该标识符由" 字母 " 的集合组成.
这个帖子确实澄清了:
包名称可以是任何名称,如果需要,可以使用大写字母启动它们.
但是约定都是小写的,我想你可以省去输入大写字母的麻烦.由于您不能拥有私有包,因此大写/小写可导出性与包无关.
一旦你知道了,就会更容易识别:
list.New()用于构造(总是在封装级,建立一个类型的初始化的情况下),如os.NewFile(),list.List用于结构类型的包列表的(另一个结构类型相同的包装中的list.Element).