为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中,类型名称是否大写?

在 Go 中,类型名称是否大写?

Go
宝慕林4294392 2022-01-17 18:21:11
在我见过的大多数 Go 程序中,即使是只有一个包的程序,类型的名称也是用大写字母书写的,这使得它们可以导出。这只是为了明确它们是类型的约定,还是需要导出所有类型?最初我打算在这里放置导出类型的示例,但是环顾一些流行的 Go 项目,我到目前为止只发现了导出类型。因此,在相当大的 Go 项目中任何未导出类型的示例都将受到欢迎。
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

以大写字母开头的类型被导出到其他包。以小写字母开头的只能在包装内使用。重要提示:可以导出接口而不导出实现它的结构。

导出类型不是惯例。仅当您允许它们在包外使用时才导出它们。在您提供的示例中,不需要导出Server类型,因为它没有导出的字段或方法。

仅导出属于与客户的合同的一部分的类型。导出仅在内部使用的类型是一个错误,并且在文档中令人困惑。

编辑:

关于Server类型的一点说明。它实现了http.Handler接口(必须定义ServeHTTP(http.ResponseWriter, *http.Request)),因此可以使其不导出并使用接口作为NewServer函数的返回类型。


查看完整回答
反对 回复 2022-01-17
?
千巷猫影

TA贡献1829条经验 获得超7个赞

类型可以是私有的。

然而,让一个公共函数返回一个私有类型是行不通的。只要该类型仅在内部使用包,我将其保密。

编辑:在您的示例中,服务器必须是公共的,因为它由公共函数返回,因此在包外使用。函数 NewServer 返回 *Server。

编辑新示例:

在新示例中,这是主包。反正也不能导入。


查看完整回答
反对 回复 2022-01-17
?
至尊宝的传说

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)

}


查看完整回答
反对 回复 2022-01-17
  • 3 回答
  • 0 关注
  • 358 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号