在我见过的大多数Go程序中,即使是那些只有一个包的程序,类型的名称也用大写字母书写,这使得它们被导出。 (实施例)
这仅仅是一个公约,以明确它们是类型还是需要导出所有类型?
以下是一些例子:
答案 0 :(得分:5)
以大写字母开头的类型将导出到其他包。以小写字母开头的那些只能在包内使用。重要说明:可以导出接口而不导出实现它的结构。
导出类型不是惯例。只有在允许它们在包装外使用时才导出它们。在您提供的示例中,无需导出Server
类型,因为它没有导出的字段或方法。
仅导出与客户签订合同一部分的类型。导出仅在内部使用的类型是错误的,并且在文档中令人困惑。
编辑:
关于Server
类型的一点说明。它实现了http.Handler
接口(必须定义ServeHTTP(http.ResponseWriter, *http.Request)
),因此可以使其不被导出并将接口用作NewServer
函数的返回类型。
答案 1 :(得分:1)
类型可以是私有的。
让公共函数返回私有类型但是不起作用。只要该类型仅在内部使用包,我将其保密。
编辑: 在您的示例中,Server必须是公共的,因为它由公共函数返回,因此在包外部使用。 NewServer函数返回* Server。
编辑新示例:
在新示例中,这是主要包。无论如何它都无法导入。
答案 2 :(得分:0)
这不是惯例,Go实际上使用大写来确定导出哪些内容,即导入包时可用。
E.g。如果我有:
package a
const Exported = "hi"
const nonExported = "mom"
然后在另一个包中,您可以导入a.Exported
但不能导入a.nonExported
:
package main
import "PATH/a"
func main() {
println(a.Exported)
// this won't compile
// println(a.nonExported)
}