Go的OOP思想
首先,让我解释这一部分中将使用的两种Go语言技术。第一种技术使用方法将函数与类型关联起来。这意味着,在某种程度上,您可以考虑函数和数据类型构造了一个对象。
使用第二种技术,可以将数据类型嵌入到新的结构类型中,以便创建一种层次结构。
还有第三种技术,即使用Go接口生成两个或多个元素——一个类的多个对象。因为本章前面的章节刚刚进行了论述,本节将不介绍这种技术。这个技术的关键点是Go接口允许您在不同的元素之间定义一个共同的行为(函数方法),这样所有这些不同的元素都可以共享一个对象的特性,因此可以认为这些不同的元素是同一个类的对象。然而,实际的面向对象编程语言的对象和类可以做更多的事情。
>```go
> type c struct {
> A a
> B b
> }
>
在Go语言中,组合技术允许使用多个struct
类型创建一个新的结构。在以上代码示例中,数据类型c
由一个结构体a
的变量和一个结构体b
的变量组合而成。
以下Go代码是ooo.go
的第三部分:
此处定义的两个方法可以使用相同的名称(A()
),因为它们具有不同的函数头。第一种方法使用a
变量,而第二种方法使用b
变量。此技术允许您在多个类型之间共享相同的函数名。
代码ooo.go
的最后一部分如下:
func main() {
var i c
i.A.A()
i.B.A()
}
执行程序的输出如下:
以下代码则说明了组合与继承的差异,结构体first
对结构体second
调用shared()
函数,对其所做的更改一无所知:
package main
import (
"fmt"
)
type first struct{}
func (a first) F() {
a.shared()
}
func (a first) shared() {
fmt.Println("This is shared() from first!")
}
type second struct {
first
}
fmt.Println("This is shared() from second!")
}
func main() {
first{}.F()
second{}.shared()
i := second{}
j := i.first
}
通过以上代码可以看到结构体second
嵌入了结构体first
,这两个结构体共享一个名为shared()
的函数。
以上Go代码保存为goCoIn.go并执行,将生成以下输出:
另外可以将j.F()
调用可以简写成(i.first).F()
或,而不需要定义太多的变量。为了更容易理解,上面的调用将这个过程分成三行代码。