在Go中,大写类型名称的惯例是什么?

时间:2016-06-15 16:31:53

标签: go

在我见过的大多数Go程序中,即使是那些只有一个包的程序,类型的名称也用大写字母书写,这使得它们被导出。 (实施例)

这仅仅是一个公约,以明确它们是类型还是需要导出所有类型?

以下是一些例子:

  • outyet
    (我错误地添加了这个:NewServer()返回Server,因此需要导出。)
  • template

3 个答案:

答案 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)
}