3 回答

TA贡献1909条经验 获得超7个赞
以大写字母开头的类型被导出到其他包。以小写字母开头的只能在包装内使用。重要提示:可以导出接口而不导出实现它的结构。
导出类型不是惯例。仅当您允许它们在包外使用时才导出它们。在您提供的示例中,不需要导出Server
类型,因为它没有导出的字段或方法。
仅导出属于与客户的合同的一部分的类型。导出仅在内部使用的类型是一个错误,并且在文档中令人困惑。
编辑:
关于Server
类型的一点说明。它实现了http.Handler
接口(必须定义ServeHTTP(http.ResponseWriter, *http.Request)
),因此可以使其不导出并使用接口作为NewServer
函数的返回类型。

TA贡献1829条经验 获得超7个赞
类型可以是私有的。
然而,让一个公共函数返回一个私有类型是行不通的。只要该类型仅在内部使用包,我将其保密。
编辑:在您的示例中,服务器必须是公共的,因为它由公共函数返回,因此在包外使用。函数 NewServer 返回 *Server。
编辑新示例:
在新示例中,这是主包。反正也不能导入。

TA贡献1789条经验 获得超10个赞
这不是约定俗成的问题,Go 实际上使用大小写来确定导出哪些内容,即在导入包时可用。
例如,如果我有:
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)
}
- 3 回答
- 0 关注
- 358 浏览
添加回答
举报