公共,私人 - 大写,小写:

时间:2013-12-31 00:55:06

标签: go private public case-sensitive access-modifiers

GoLang的新手,来自Delphi,C ++:

我第一次尝试在Go中创建自己的包时,我遵循了有关如何布局工作空间等的所有说明,但我一直在收到编译错误:

./myPackage.go:52: undefined: myFunc

稍微探讨一下后,我发现Go中的公共访问修饰符只需通过大写声明一个函数即可实现。大。

但是当我开始尝试容器类 - List作为初学者时,我发现我必须声明一个List引用返回值,如下所示:

func GetFactors(value *int64) *list.List {...

*list为小写。

当我声明对列表的本地引用时 - 我必须使用:

l := list.New()

再次,list的小写。

所以,我很困惑。规则是什么?列表调用和引用显然是公开的,或者我无法调用/使用它们 - 那么为什么它们是小写的呢?

3 个答案:

答案 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()确实澄清了:

  

包名称可以是任何内容,如果需要,可以用大写字母开头。
  但是约定都是小写的,我想你可以省去输入大写字母的麻烦。

     

大写/小写可导出性与包无关,因为您不能拥有私有包。

一旦你知道,就会更容易识别: