Go语言的类型系统-结构体与方法

Go语言可以让用户定义类型,当用户声明一个新类型时,这个声明就给编译器提供了一个框架,告知必要的内存大小和表示信息。

结构体

声明结构体的关键字 struct 与C一样一样的,处处都是C的影子。

1
2
3
4
type user struct {
name string
email string
}

var 表示一个变量并设置为零值,:= 一个短变量声明操作符,声明一个变量并初始化。

1
var zjj user
1
2
3
4
zjj := user{
name: "zjj",
email: "xxxx@qq.com",
}

上面演示了一种给结构体赋值的方式,还有一种是。需要注意的是上面类似于json的书写方式结尾要保留一个,下面不用

1
zjj := user{ "zjj", "xxxx@qq.com"}

方法

方法能给用户定义的类型添加新的行为,方法实际上也是函数,只是在声明时,在关键字func和方法名之间增加了一个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main

import "fmt"

type user struct {
name string
email string
}

//使用值接收者实现的一个方法
func (u user) notify(){
fmt.Printf("%s同学的邮箱为:%s\n",u.name,u.email)
}

//使用指针接受者实现的方法
func (u *user) changEmail(e string){
u.email = e
}

func main() {
zjj := user{name:"zjj",email:"222@qq.com"}
zjj.changEmail("1111")
zjj.notify()


dx := &user{name:"dx",email:"111@qq.com"}
dx.changEmail("2222")
dx.notify()

}

  • 使用值接收者声明,调用时会用这个值的一个副本来执行
1
2
dx := &user{name:"dx",email:"111@qq.com"}
dx.notify()

Go在背后偷摸着这样实现了指针的解引操作

1
(*dx).notify
  • 指针接收者声明,接收者的类型是user的指针而不是值,使用这种方法时会共享修改内容。
1
2
3
4
//使用指针接受者实现的方法
func (u *user) changEmail(e string){
u.email = e
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~