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