面试题答案
一键面试闭包实现数据封装的原理
在Go语言中,闭包是一个函数值,它引用了其函数体之外的变量。通过闭包,我们可以将数据(变量)和操作这些数据的函数封装在一起,外部代码无法直接访问被闭包引用的变量,只能通过闭包返回的函数来间接访问和修改这些变量,从而实现数据封装。
示例代码
package main
import "fmt"
// NewCounter 创建一个计数器闭包
func NewCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
代码解释
- 定义闭包函数:
NewCounter
函数返回一个匿名函数,该匿名函数引用了NewCounter
函数内部的变量count
。这里count
就是被封装的数据。 - 数据封装:
count
变量在NewCounter
函数内部定义,外部代码无法直接访问count
。 - 访问和修改数据:返回的匿名函数(闭包)通过对
count
变量进行自增操作并返回其值,实现了对count
的访问和修改。每次调用闭包函数时,都会修改count
的值并返回新的值。
使用示例
func main() {
counter := NewCounter()
fmt.Println(counter()) // 输出 1
fmt.Println(counter()) // 输出 2
fmt.Println(counter()) // 输出 3
}
在 main
函数中,我们创建了一个 counter
闭包实例,每次调用 counter
函数时,都会访问并修改被封装的 count
变量的值。