当前位置:网站首页>Go 支持 OOP: 用 struct 代替 class
Go 支持 OOP: 用 struct 代替 class
2022-08-01 06:46:00 【dj1540225203】
其实go和php,java那些在对面向对象的处理很像,只不过go没有class类。
Go 是面向对象吗?
Go 中没有 Class 的概念,它其实不是一个纯粹的面向对象的编程语言。
Go 有类型和方法,也支持面向对象的编程风格。但是没有类型层次的结构。Go 的接口是定义一组方法的集合的类型,这些接口使用简单且通用,它们也支持嵌入到其他类型中,方便提供与子类类似但不相同的东西。
struct 代替 class
Go 没有 class 但是有 struct ,可以给 struct 添加方法。还可以将数据和对数据的操作的方法进行绑定。这像是 Class。
package modules
type Users struct {
Name string
Age int
Status bool
}
func (u Users) SetUserStatus(){
u.Status = false;
fmt.Printf("设置 %s 的状态为 %t \n ",u.Name,u.Status)
}
// main.go
package main
func main(){
user := modules.Users{
Name:"Tom",
Age:12
Status:false
}
user.SetUserStatus()
}
复制代码以上代码定义了结构体 Users ,再绑定一个 setUserStatus 的方法,方法里就可以操作结构体的属性。在 mian 文件中我们就可以初始化一个 User 结构体的变量 user,然后操作该变量的方法。这和 Class 很相似。
New() 函数代替构造函数
在 C#、Java 中,创建一个类时都会自带一个不带参数的构造函数。那么在 Go 中可以使用 New() 方法发挥构造函数的作用。
刚才在上面的 Demo 中我们定义并初始化了一个 Users 结构体的变量 user。当我们使用零值定义 Users 结构体时会怎么样?
package main
func main(){
var u modules.Users
u.setUserStatus()
}
// 执行 go run main.go 结果如下:
设置 的状态为 false
复制代码如你所见,使用零值创建的变量,没有有效的 name ,输出的结果中没有 name 值,只是一个空字符串。在 Java 语言中,我们经常会使用构造函数来解决这个问题,使用参数化的构造函数来创建有效的对象。比如 Java 程序中:
// 在 java 语言中
public class Users{
public string Name
Users(name){
this.name = name;
}
}
// 使用
Users user = new User("Tom")
复制代码Go 不支持构造函数。为避免发生其他包访问类型为 Users 的结构体时定义零值的变量,产生无效的作用。通过提供一个名为 New 的函数,该函数用所需的值初始化类型 Users。
在Go 中,将创建 T 类型值的函数命名为 NewT(params) 是一种约定。这将充当构造函数。当包里只有一种类型,则该约定就是将函数命名为 New(params), 而不是 NewT(params)。
所以我们正确使用方式如下:
package modules
type users struct {
name string
age int
status bool
}
func New(name string, age int, status bool) Users {
user := users{name, age, status}
return user
}
func (u Users) setUserStatus(){
u.status = false;
fmt.Printf("设置 %s 的状态为 %t \n ",u.name,u.status)
}
复制代码从上面的代码上可以看到:
- 我们将结构体 Users 改为私有的,它的字段也都设置为私有的,防止外部其他的包访问。因为我们不需要除了 modules 包外的其他地方访问 users 的字段,除非有其他特定场景需要。
- 另外,增加了一个公有的 New 函数,该函数的参数就是 user 结构体的字段,并且返回一个新创建的 user 实例。
使用只需调用 New 函数,这样就能防止创建不可用的 user struct 类型值。这也是创建 user 的唯一方法。
// 使用
package main
func main(){
user := modules.New("Jack", 30, true)
user.setUserStatus()
}
复制代码因此,Go 虽然不支持 class ,但我们可以有效的使用 struct 来代替 class ,并使用 New 函数来代替构造函数。这样就可以实现 OOP。
作者:六号积极分子
链接:https://juejin.cn/post/7120926520662556686
来源:稀土掘金
边栏推荐
- 我三本学历,五面阿里,被面试官“供”着出来了,拿了33*15的Offer
- Vim三种模式
- 解决浏览器滚动条导致的页面闪烁问题
- [Translation] Securing cloud-native communications: From ingress to service mesh and beyond
- NUMPY
- 牛客刷SQL---2
- 信息系统项目管理师必背核心考点(五十六)配置控制委员会(CCB)的工作
- 插入排序—直接插入排序和希尔排序
- WebSocket implements chat function
- Information system project managers must recite the work of the core test site (56) Configuration Control Board (CCB)
猜你喜欢

爆肝3万字,最硬核丨Mysql 知识体系、命令全集 【建议收藏 】

信息系统项目管理师必背核心考点(五十六)配置控制委员会(CCB)的工作

AspNet.WebApi.Owin custom Token request parameters

第02章 MySQL的数据目录【1.MySQL架构篇】【MySQL高级】

Motion analysis and parameter optimization of crank-slider mechanism

Dart 异常详解

leetcode125 Verify palindrome string

JS的运行原理

爬虫框架 Scrapy 详解

WebSocket implements chat function
随机推荐
Create, modify and delete tables
数据机构----线性表之单向链表
vsce package 后出现 Command failed: npm list --production --parseable --depth=99999 --loglevel=error异常
Matlab simulink particle swarm optimization fuzzy pid control motor pump
Detailed explanation of the crawler framework Scrapy
uva10825
leetcode125 验证回文串
太厉害了,终于有人能把文件上传漏洞讲的明明白白了
说说js中使用for in遍历数组存在的bug
dbeaver连接MySQL数据库及错误Connection refusedconnect处理
NUMPY
I have three degrees, and I have five faces. I was "confessed" by the interviewer, and I got an offer of 33*15.
MATLAB program design and application of MATLAB 2.5
企业员工人事管理系统(数据库课设)
Classwork (7) - #598. remainder operation (mod)
零代码网站开发利器:WordPress
NIO programming
matlab simulink 粒子群优化模糊pid控制的电机泵
测试工具(四)Jenkins环境搭建与使用
Sound Signal Processing Fundamental Frequency Detection and Time-Frequency Analysis