其实go和php,java那些在对面向对象的处理很像,只不过go没有class类。
Go 中没有 Class 的概念,它其实不是一个纯粹的面向对象的编程语言。
Go 有类型和方法,也支持面向对象的编程风格。但是没有类型层次的结构。Go 的接口是定义一组方法的集合的类型,这些接口使用简单且通用,它们也支持嵌入到其他类型中,方便提供与子类类似但不相同的东西。
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 很相似。
在 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)
}
复制代码
从上面的代码上可以看到:
使用只需调用 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
来源:稀土掘金