⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战

⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - 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 接⼝

与其他主要编程语⾔的差异

  1. 接⼝为⾮⼊侵性,实现不依赖于借⼝定义:在Go语言中,接口是一种定义行为的方式,而不是定义类型的方式。这意味着实现接口的类或类型不需要显式地声明实现了某个接口,只要实现了接口定义的所有方法即可。
  2. 接口的定义可以包含在接口使用者包内:在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语言主要是多练,多找些代码段写写,不懂可以私聊咨询。
码字不易,如果该文章有用,请多多关注或者赞赏,谢谢!

欢迎关注云尔Websites CSDN博客

相关推荐
毕设源码-李学长3 分钟前
计算机毕业设计java高校多媒体教室管理系统高校多媒体教室综合管理系统高校智能多媒体教室管理平台
java·开发语言·课程设计
先知后行。12 分钟前
线程的创建.销毁
开发语言·c++·算法
鱼嘻16 分钟前
西嘎嘎学习 - C++ 继承 - Day 10
开发语言·c++·学习·算法
孤廖22 分钟前
从 “模板” 到 “场景”,用 C++ 磨透拓扑排序的实战逻辑
开发语言·c++·程序人生·算法·贪心算法·动态规划·学习方法
我有火的意志31 分钟前
Liunx执行source /etc/profile 报错, -bash: HISTTIMEFORMAT: readonly variable
开发语言·bash·histtimeformat·readonly
Sally璐璐1 小时前
Go语言开发工具全解析
网络·golang
蒋星熠1 小时前
中间件架构设计与实践:构建高性能分布式系统的核心基石
开发语言·数据库·分布式·python·中间件·性能优化·硬件工程
枫叶丹41 小时前
【Qt开发】显示类控件(二)-> QLCDNumber
开发语言·qt
励志不掉头发的内向程序员1 小时前
STL库——AVL树
开发语言·c++·学习
晨非辰3 小时前
#C语言——刷题攻略:牛客编程入门训练(十一):攻克 循环控制(三),轻松拿捏!
c语言·开发语言·经验分享·学习·visual studio