在我看过的大多数Go程序中,即使只有一个包的程序,类型的名称也用大写字母书写,这使得它们被导出.(例)
这只是一个公约,以明确它们是类型还是需要导出所有类型?
这里有些例子:
以大写字母开头的类型将导出到其他包.以小写字母开头的那些只能在包内使用.重要说明:可以导出接口而不导出实现它的结构.
导出类型不是惯例.只有在允许它们在包装外使用时才导出它们.在您提供的示例中,无需导出Server类型,因为它没有导出的字段或方法.
仅导出与客户端签订合同一部分的类型.导出仅在内部使用的类型是错误的,并且在文档中令人困惑.
编辑:
关于Server类型的一点澄清.它实现了http.Handler接口(必须定义ServeHTTP(http.ResponseWriter, *http.Request)),因此可以使其不被导出并使用接口作为NewServer函数的返回类型.
类型可以是私有的。
然而,让公共函数返回私有类型是行不通的。只要该类型仅在内部使用包,我就将其保留为私有。
编辑:在您的示例中,服务器必须是公共的,因为它是由公共函数返回的,因此在包外部使用。函数 NewServer 返回 *Server。
编辑新示例:
在新示例中,这是主包。无论如何都无法导入。