Go语言中的struct | 青训营笔记

83 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第2天

Go 中是没有 class 的,但是有一个结构体 struct 。结构体是用户定义的类型,是一种聚合的数据类型,由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。Go语言的struct,与C++语言中的 class 类似 , 可以定义字段属性和方法。

声明一个结构体

type user struct {
   name     string
   password string
}

可以看到,和C++等语言的声明十分类似

var d user
d.name = "wang"
d.password = "1024"

结构体变量的成员可以通过点操作符访问

结构体的指针

结构体与数组一样,都是值传递。为了提高性能,一般不会把数组直接传递给函数,而是使用切片(引用类型)代替,而把结构体传给函数时,可以使用指针结构体。

指针结构体,即一个指向结构体的指针,声明结构体变量时,在结构体类型前加*号。

如下图所示,两个函数分别传入结构体和结构体指针:

func checkPassword(u user, password string) bool {
   return u.password == password
}

func checkPassword2(u *user, password string) bool {
   return u.password == password
}

结构体方法

Go 中没有对象这一概念,所以采用了结构体的概念,结构体在 Go 中有着非常重要的位置。

Go 语言同时有函数和方法,方法的本质是函数,但是方法和函数又具有不同点。函数 function 是一段具有独立功能的代码,可以被重复多次调用,从而实现代码复用。方法 method 是一个类的行为功能,只有该类的对象才能调用。

Go 方法是作用在接收者上的一个函数,接收者是某种类型的变量,因此方法是一种类型的函数。接收者类型几乎可以任何类型,指针类型和函数类型就不行,方法不能被重载。

Go语言实现结构体方法操作如下:

type user struct {
   name     string
   password string
}

func (u user) checkPassword(password string) bool {
   return u.password == password
}

func (u *user) resetPassword(password string) {
   u.password = password
}

func main() {
   a := user{name: "wang", password: "1024"}
   a.resetPassword("2048")
   fmt.Println(a.checkPassword("2048")) // true
}