首页 > 其他分享 >Go:大小写区别

Go:大小写区别

时间:2024-10-24 19:23:15浏览次数:7  
标签:首字母 fmt 区别 导出 package 访问 大小写 Go main

在 Go 语言中,标识符的大小写不仅仅是书写上的区别,它直接关系到可见性访问权限,即是否可以在包外部(跨包)访问某个标识符(变量、常量、函数、结构体、方法等)。

1. 大小写与可见性规则

Go 使用了一种简单而直接的机制来控制标识符的访问权限:

  • 首字母大写:标识符对其他包(package)可见,称为导出(exported)
  • 首字母小写:标识符对其他包不可见,只在当前包内可访问,称为未导出(unexported)

2. 具体应用

1. 函数和方法

  • 首字母大写的函数或方法可以在其他包中被调用。
  • 首字母小写的函数或方法只能在定义它的包内调用。

例如:

// package main
package main

import "fmt"

func main() {
    fmt.Println(Add(2, 3)) // 可以调用,因为 Add 函数是大写的,被导出
    // fmt.Println(subtract(2, 3))  // 不能调用,因为 subtract 函数是小写的,未导出
}

// 被导出的函数
func Add(a, b int) int {
    return a + b
}

// 未导出的函数
func subtract(a, b int) int {
    return a - b
}

在这个例子中,Add 函数可以在其他包中调用,而 subtract 函数则只能在当前包内使用。

2. 变量和常量

  • 首字母大写的变量或常量可以被其他包访问。
  • 首字母小写的变量或常量只能在当前包内使用。

例如:

// package main
package main

import "fmt"

var ExportedVar = "I am accessible from other packages"
var unexportedVar = "I am only accessible within this package"

func main() {
    fmt.Println(ExportedVar)  // 可以访问
    fmt.Println(unexportedVar) // 可以访问,因为我们在同一个包中
}

如果 unexportedVar 是在其他包中定义的,则不能直接访问它。

3. 结构体和字段

  • 首字母大写的结构体类型可以被其他包使用。
  • 结构体字段的首字母大写,可以在其他包中访问。小写的字段则只能在当前包内访问

例如:

// package shapes
package shapes

// 导出结构体类型
type Circle struct {
    Radius float64  // 导出字段
    color  string   // 未导出字段
}

// 导出方法
func (c *Circle) SetColor(col string) {
    c.color = col  // 可以访问,因为在同一个包内
}

其他包可以创建 Circle 实例并访问 Radius 字段,但无法直接访问 color 字段。

在另一个包中:

// package main
package main

import (
    "fmt"
    "shapes"
)

func main() {
    c := shapes.Circle{Radius: 5}
    fmt.Println(c.Radius) // 可以访问 Radius
    // fmt.Println(c.color)  // 无法访问 color,因为它是小写的,未导出
}

4. 接口

Go 语言中的接口(interface)和方法规则相同:

  • 接口本身和接口的方法如果首字母大写,它们就可以被其他包使用。
  • 如果接口或者方法首字母小写,它们只能在定义它们的包内使用。

3. 导出(Exporting)和未导出(Unexporting)的设计哲学

Go 语言的这种设计方式强调了封装性模块化。通过控制标识符的访问权限,开发者可以:

  • 将实现细节隐藏在包内部,只暴露必要的接口给外部使用,类似于其他语言中的publicprivate 访问修饰符。
  • 提供简单而统一的规则,避免使用复杂的关键字或修饰符来控制访问权限。

4. 实际应用中的注意事项

  • 包名规范:Go 社区推荐使用简短、清晰的包名,避免在包名中使用大写字母。例如,mathfmtstrings 这样的包名很常见。
  • 保持一致性:在设计 API 时,要有意识地决定哪些函数、方法、类型、变量、常量需要导出,并保持包的接口简单明了。只暴露真正需要被外部使用的标识符,其他的都保持未导出状态。

5. 总结

  • 首字母大写:表示标识符是导出的,可以被其他包访问。
  • 首字母小写:表示标识符未导出,只能在当前包内使用。
  • Go 语言的这种机制有助于开发者更好地封装代码,实现模块化设计,同时保持代码的简洁和可维护性。

标签:首字母,fmt,区别,导出,package,访问,大小写,Go,main
From: https://www.cnblogs.com/niumachen/p/18500278

相关文章

  • [Go] 如何妥善处理 TCP 代理中连接的关闭
    如何妥善处理TCP代理中连接的关闭相比较于直接关闭TCP连接,只关闭TCP连接读写使用单工连接的场景较少,但通用的TCP代理也需要考虑这部分场景。背景今天在看老代码的时候,发现一个TCP代理的核心函数实现的比较粗糙,收到EOF后直接粗暴关闭两条TCP连接。funcConnCat(u......
  • python32位和64位的区别是什么
    python32位和64位有什么区别?64位能够用更大的内存空间,64位可以在64位的系统下运行,但是不能在32位系统下运行。32位能够在32位和64位上运行,考虑到兼容性,建议使用32位的python。如何查看python是32位还是64位可使用IDLE或者CMD查看。方法一:打开IDLE,看第一行提示,例如:32位......
  • typeof 和GetType的区别
    1.总结typeof:用于获取编译时已知类型的 Type 对象。适用于静态类型检查。GetType:用于获取运行时对象的实际类型的 Type 对象。适用于动态类型检查。选择使用哪一个取决于你的具体需求:如果你知道类型并且在编译时确定,使用 typeof。如果你需要在运行时根据对象的实际......
  • 在 Go 中,如何实现一个带过期时间的字典映射
    有些时候,应用系统用不上redis,我们也可以用锁和goroutine实现一个带有过期时间的线程安全的字典。这种字典的应用场景,比较倾向于数据规模较小,没有分布式要求。下面是实现:1、定义结构typeItemstruct{valueinterface{}expireAtint64}typeTTLM......
  • Django中的ModelForm组件
    昨天开发项目的时候,发现在表单创建时,流程很繁琐,想这有没有简易方式去创建表单,结果查资料,发现django提供了一个非常简单实用且人性化的组件modelform,用起来贼快,还能做表单校验,很爽,记录一下。在Django中,modelform是一个非常有用的功能,它允许你基于Django的模型(Model)自动......
  • Go 中,`...` 运算符
    在Go语言中,...运算符有两个主要用途,分别用于变长参数函数和切片展开。1.变长参数函数在Go语言中,使用...运算符可以定义一个接受可变数量参数的函数,也就是“变长参数函数”。这种函数可以接收不确定数量的参数,并将这些参数当作切片来处理。语法:funcfunctionName(args......
  • Go语言中的位运算符
    位运算(bitwiseoperations)是计算机科学中非常基础且重要的运算类型,它直接操作二进制位。Go语言中提供了一组位运算符,用于执行位级别的操作。Go语言中的位运算符按位与(&):作用:对两个操作数的每个位进行与运算,只有对应位都为1时,结果位才为1。示例:5&3(0101&0011=0001),结......
  • Go 语言中的 切片 --slice
    为了更好地理解Go语言中的切片(slice),我们可以将它与C++中的数组或容器(如std::vector)进行比较,但要注意的是,它们之间有一些关键的区别。让我们逐步将Go的切片与C++中的概念进行对应:1.数组vs切片在C++中,数组(array)是一种固定大小的数据结构,大小必须在编译时确定,并且......
  • GO:可变长参数和切片作为函数参数
    在Go语言中,可变函数参数(可变长参数)和切片作为函数参数是两个不同的概念,虽然它们都能处理多个元素,但它们的用途和处理方式有所不同。以下是它们之间的详细区别:1.可变函数参数(VariadicFunctionParameters)可变参数函数可以接受不定数量的参数,使用...运算符来定义。这些参数......
  • GitHub和GitLab在代码托管和协作中有什么区别
    GitHub和GitLab是两个流行的代码托管和协作平台,虽然它们在功能和目的上有许多相似之处,但在一些关键方面存在显著差异。主要区别有:1.界面设计和用户体验;2.功能特性和应用;3.集成工具和插件;4.社区支持和开源项目;5.定价策略和企业应用;6.安全性和私有性。1.界面设计和用户体验GitHu......