当前位置:网站首页>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
来源:稀土掘金
边栏推荐
- 声音信号处理基频检测和时频分析
- After the image is updated, Glide loading is still the original image problem
- JS的运行原理
- Xiaobai's 0 Basic Tutorial SQL: An Overview of Relational Databases 02
- NUMPY
- 基于MATLAB的BP神经网络进行语音特征信号分类
- 选择排序—直接选择排序和堆排序
- Offer brush questions - 1
- datagrip 报错 “The specified database userpassword combination is rejected...”的解决方法
- Offer刷题——1
猜你喜欢
MySQL row locks and gap locks
Information system project managers must recite the work of the core test site (56) Configuration Control Board (CCB)
从离线到实时对客,湖仓一体释放全量数据价值
first unique character in characters
Qt Widget project loading example of qml
【音视频】srs直播平台搭建
响应式织梦模板园林花卉类网站
我说过无数遍了:从来没有一种技术是为灵活组合这个目标而设计的
数据机构----线性表之单向链表
Robot growth in China
随机推荐
爬虫框架 Scrapy 详解
Matlab simulink particle swarm optimization fuzzy pid control motor pump
matplotlib pyplot
uva12326
flinkcdc对mysql的date字段类型转化有什么解决思路么
NUMPY
Information system project managers must recite the work of the core test site (56) Configuration Control Board (CCB)
torch
问下 mysql向pg同步多个表的话 有什么好的方案吗?
Windows taskbar icon abnormal solution
Using FiddlerScript caught poly FiddlerScript 】 【 download
Speed up your programs with bitwise operations
AspNet.WebApi.Owin 自定义Token请求参数
matlab wind speed model wavelet filtering
LeetCode Question of the Day (309. Best Time to Buy and Sell Stock with Cooldown)
The BP neural network based on MATLAB voice characteristic signal classification
leetcode125 Verify palindrome string
05-SDRAM:仲裁
点餐系统数据库设计--SQL Server
torch