⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战
一、封装数据和⾏为
结构体定义
定义了一个名为Structural的结构体。结构体是一种用户自定义的数据类型,可以包含不同类型的字段(成员变量)。
与其他主要编程语⾔的差异:
//第⼀种定义⽅式在实例对应⽅法被调⽤时,实例的成员会进⾏值复制
func (e Structural) String() string {
return fmt.Sprintf("ID:%s-Name:%s-Age:%d", e.Id, e.Name, e.Age)
}
//通常情况下为了避免内存拷⻉我们使⽤第⼆种定义⽅式
func (e *Structural) String() string {
return fmt.Sprintf("ID:%s/Name:%s/Age:%d", e.Id, e.Name, e.Age)
}
实例创建及初始化
使用该结构体类型来创建实例。在Go语言中,可以使用字面量方式创建结构体实例,并同时初始化字段的值。
go
func main() {
// 创建一个Structural结构体的实例,并初始化了Id、Name和Age字段的值。
emp := Structural{
Id: "456",
Name: "Jo Doe",
Age: 33,
}
//empPtr := new(Employee) //还可以使用new关键字创建了一个指向Employee结构体的指针empPtr,然后通过指针访问和修改了结构体的字段。
// 访问和输出结构体字段的值
fmt.Println("ID:", emp.Id)
fmt.Println("Name:", emp.Name)
fmt.Println("Age:", emp.Age)
}
二、定义交互协议
接⼝与依赖
接口(interface)是一种定义行为的类型。接口定义了一个对象的行为,而不关心对象是什么类型。这种机制使得Go语言具有很强的灵活性和可扩展性。
接口的定义使用interface关键字,后面跟着接口名称和方法列表。
代码示例:
go
type Writer interface {
Write(data []byte) (int, error)
}
上面的代码,定义了一个名为Writer的接口,它有一个Write方法,该方法接受一个字节切片并返回一个整数和一个错误。
接口可以被其他类型实现。一个类型实现了一个接口,意味着它实现了接口定义的所有方法。这使得在Go语言中可以通过接口来实现多态性。
例如,我们可以定义一个File类型,并让它实现Writer接口:
go
type File struct {
name string
}
func (f *File) Write(data []byte) (int, error) {
// 实现Write方法的具体逻辑
return len(data), nil
}
上面的代码,File类型实现了Writer接口,因为它提供了与Writer接口相同的Write方法。这样,我们就可以将File类型的对象赋值给Writer类型的变量,或者将Writer类型的变量赋值给File类型的变量,而不会出现编译错误。
依赖管理在Go语言中通常使用包(package)来实现。每个包都包含了一组相关的函数、类型和常量。通过导入包,我们可以使用包中的函数和类型。
Go语言的标准库提供了许多常用的包,例如fmt、os、io等。我们也可以创建自己的包,并在其他项目中导入使用。
依赖管理在Go语言中是非常简单的。我们只需要将依赖的包导入到我们的项目中即可。Go语言会自动解析并下载所有依赖的包。这使得Go语言的依赖管理非常方便和高效。
Go 接⼝
与其他主要编程语⾔的差异
- 接⼝为⾮⼊侵性,实现不依赖于借⼝定义:在Go语言中,接口是一种定义行为的方式,而不是定义类型的方式。这意味着实现接口的类或类型不需要显式地声明实现了某个接口,只要实现了接口定义的所有方法即可。
- 接口的定义可以包含在接口使用者包内:在Go语言中,接口的定义可以放在任何包内,包括接口使用者自己的包内。
接⼝变量
#### ⾃定义类型
要定义自定义类型,首先需要定义一个结构体类型,该结构体类型实现了接口中定义的所有方法。然后,可以使用结构体类型来创建该类型的对象,即自定义类型的实例。
下面是一个示例代码,演示了如何定义一个自定义类型并实现接口的方法:
go
package main
import "fmt"
// 定义接口
type Shape interface {
Area() float64
Perimeter() float64
}
// 定义结构体类型
type Rectangle struct {
width, height float64
}
// 实现接口的 Area 方法
func (r Rectangle) Area() float64 {
return r.width * r.height
}
// 实现接口的 Perimeter 方法
func (r Rectangle) Perimeter() float64 {
return 2 * (r.width + r.height)
}
func main() {
// 创建自定义类型的对象
rect := Rectangle{width: 5, height: 3}
// 使用接口的方法调用自定义类型的方法
fmt.Println("Area:", rect.Area())
fmt.Println("Perimeter:", rect.Perimeter())
}
在上面的示例中,我们定义了一个Shape接口,该接口包含了Area()和Perimeter()两个方法。然后,我们定义了一个Rectangle结构体类型,并为其实现了这两个方法。通过创建Rectangle类型的对象rect,我们可以调用其实现的接口方法Area()和Perimeter()。
学习Go语言主要是多练,多找些代码段写写,不懂可以私聊咨询。
码字不易,如果该文章有用,请多多关注或者赞赏,谢谢!