我正在阅读Grady Booch的书" 面向对象分析和应用程序设计"第三版.在第94页,Booch说:
我们可以将一个类的接口分为四个部分:
- 公共:所有客户都可以访问的声明
- 受保护:只能由类本身及其子类访问的声明
- 私有:只能由类本身访问的声明
- 包:只能由同一包中的类访问的声明
我可以理解为什么保护声明可以被认为是一个接口,因为类的子类也是这个类的客户端.
但我不明白为什么私人声明可以被视为接口.请让我高兴.
这是一些 Go 书籍中的代码片段。
func incr(s []int) {
s = append(s, 0)
for i := range s {
s[i]++
}
}
func main() {
s1 := []int{1, 2}
s2 := s1
s2 = append(s2, 3)
incr(s1)
incr(s2)
fmt.Print(s1, s2) // "[1, 2][2, 3, 4]"
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么结果是“[1, 2][2, 3, 4]”。
基于https://golang.org/doc/ effective_go#slices 中的两点:
切片保存对基础数组的引用,如果将一个切片分配给另一个切片,则两个切片都引用同一个数组
如果函数采用切片参数,则调用者可以看到它对切片元素所做的更改,类似于将指针传递给底层数组
这是我想象应该发生的事情:
incr(s1),s1 被追加 0,所有项递增,结果 s1 变为 [2, …