当前位置:网站首页>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
来源:稀土掘金
边栏推荐
- 「面经分享」西北大学 | 字节 生活服务 | 一面二面三面 HR 面
- 05-SDRAM: Arbitration
- "By sharing" northwestern university life service | | bytes a second interview on three sides by HR
- Xiaobai's 0 Basic Tutorial SQL: An Overview of Relational Databases 02
- uva10825
- 我三本学历,五面阿里,被面试官“供”着出来了,拿了33*15的Offer
- Practical training Navicat Chinese and English mode switching
- Bean的生命周期
- 从购买服务器到网站搭建成功保姆级教程~超详细
- 05-SDRAM:仲裁
猜你喜欢

Datagrip error "The specified database userpassword combination is rejected..."Solutions

LeetCode 0149. Maximum number of points on a line

Guest brush SQL - 2

Robot growth in China

Offer brush questions - 1

Dialogue with the father of MySQL: One excellent programmer is worth 5 ordinary programmers

MySQL row locks and gap locks

MATLAB程序设计与应用 2.5 MATLAB运算

牛客刷SQL---2

第5章——以程序方式处理MySQL数据表的数据
随机推荐
uva12326
Windows taskbar icon abnormal solution
Using FiddlerScript caught poly FiddlerScript 】 【 download
Talk about the bugs in using for in to traverse the array in js
基于MATLAB的BP神经网络进行语音特征信号分类
MySQL row locks and gap locks
响应式织梦模板园林景观类网站
【视觉SLAM十四讲】第一章理论详解
从零开始—仿牛客网讨论社区项目(一)
leetcode125 Verify palindrome string
Does flinkcdc have any solution for mysql's date field type conversion?
matlab wind speed model wavelet filtering
【南瓜书ML】(task4)神经网络中的数学推导(更新ing)
爆肝3万字,最硬核丨Mysql 知识体系、命令全集 【建议收藏 】
表的创建、修改与删除
Practical training Navicat Chinese and English mode switching
datagrip 报错 “The specified database userpassword combination is rejected...”的解决方法
旋度(7)连接失败localhost8080;连接拒绝了
05-SDRAM:仲裁
企业员工人事管理系统(数据库课设)