Golang 封装
封装的定义是将数据封装在一个单一的单元中。它是将代码和它所操作的数据绑定在一起的机制。从另一个角度来说,封装是一个保护罩,可以防止数据被这个保护罩外的代码访问。

在面向对象的语言中,一个类的变量或数据被隐藏起来,不被任何其他类所发现,只能通过它们所声明的自己的类的任何成员函数来访问。但是Go语言不支持类和对象。因此,在Go语言中,封装是通过使用包来实现的。Go语言提供两种不同类型的标识符,即导出的和未导出的标识符。封装是通过从包中导出的元素(变量、函数、方法、字段、结构)实现的,它有助于控制元素(变量、函数、方法、字段、结构)的可见性。如果定义这些元素的包在你的程序中可用,那么这些元素就是可见的。
1.出口标识符: 出口标识符是那些从定义它们的包中导出的标识符。这些标识符的第一个字母总是用大写字母。这个大写字母表示给定的标识符是导出的标识符。输出的标识符总是被限制在它们被定义的包中。当你从包中导出指定的标识符时,你只需导出名称而不是该标识符的实现。这种机制也适用于函数、字段、方法和结构。
例子
// Go program to illustrate
// the concept of encapsulation
// using exported function
package main
import (
"fmt"
"strings"
)
// Main function
func main() {
// Creating a slice of strings
slc := []string{"GeeksforGeeks", "geeks", "gfg"}
// Convert the case of the
// elements of the given slice
// Using ToUpper() function
for x := 0; x < len(slc); x++ {
// Exported Method
res := strings.ToUpper(slc[x])
// Exported Method
fmt.Println(res)
}
}
输出
GEEKSFORGEEKS
GEEKS
GFG
解释: 在上面的例子中,我们通过从strings包中导出ToUpper()函数将slice中的元素的大小写转换为大写。
res := strings.ToUpper(slc[x])
这里,ToUpper()函数的第一个字母是大写的,这表明这个函数是导出的函数。如果你试图将ToUpper()函数的大小写改为小写,那么编译器将给出一个错误,如下所示。
res := strings.toUpper(slc[x])
Output:
./prog.go:22:9: cannot refer to unexported name strings.toUpper
./prog.go:22:9: undefined: strings.toUpper
所以,这个过程(导出变量、字段、方法、函数、结构)被称为封装。由于封装,我们在程序中只导出了函数的名称,而不是整个函数的定义,ToUpper()函数的定义被包裹在strings包中,所以为了导出ToUpper()函数,你首先需要在程序中导入strings包。
2.未导出的标识符: 未导出的标识符是那些没有从任何包中导出的标识符。它们总是用小写字母表示。如下面的例子所示,加法函数与任何包都没有关系,所以它是一个未导出的函数,这个方法的可见性只限于这个程序中。
例子
// Go program to illustrate
// the unexported function
package main
import "fmt"
// The addition function returns
// the sum of the elements
// Unexported function
func addition(val ...int) int {
s := 0
for x := range val {
s += val[x]
}
fmt.Println("Total Sum: ", s)
return s
}
// Main function
func main() {
addition(23, 546, 65, 42, 21, 24, 67)
}
输出
Total Sum: 788
封装的好处
- 向用户隐藏实现细节。
- 增加代码的可重用性。
- 它可以防止用户任意设置函数的变量。它只由同一包中的函数设置,并且该包的作者确保该函数保持其内部不变性。
极客教程