前言
go语言是静态类型语言,也就是在编译时编译器需要知道程序中值的类型,这样有利于减少bug和提高性能,具体就是内存的分配量和其中的内容
用户定义类型
1.用户定义新的类型,需要使用type 和struct关键字
type user struct {name stringemail stringphone int}
这个类型就类似于面向对象时抽象出来的一个对象
可以用来创建值
var jack user
这样jack就是一个user类型的变量,不初始化时数值类型默认为0,字符串为空字符串,布尔为false
可以利用短变量声明操作符(: =)对变量初始化
lisa := user{
name:"lisa",
email:"aaa@bb.com",
phone:"134343434"
}
如下,也可以不用字段名直接按顺序赋值
lisa := user{"Lisa", "lisa@email.com", 123, true}
同时,结构体也可以嵌套,如下,person是一个user结构体类型的变量
type admin struct {person userlevel string}
如此初始化时也要对person按照结构体的方式进行赋值
2. 声明新类型还可以用已有的基础类型延伸,例如
type Duration int64
Duration基于int64类型,它的单位是ns(纳秒)
虽然是基于int64声明的,但它不兼容int64类型的值,强行赋值的话,编译器无法进行转换,会报错
方法
func关键字可以声明方法,如下
// notify 使用值接收者实现了一个方法func (u user) notify() {fmt.Printf("Sending User Email To %s<%s>\n",u.name,u.email)}// changeEmail 使用指针接收者实现了一个方法func (u *user) changeEmail(email string) {u.email = email}
两种接收者就类似于其他语言中的函数形参,都可以用来调用方法自身,两者特点是,值接收者在调用时会生成一个副本,指针接收者则会影响到原值,在编码时对两者的抉择,会有一些基本的指导原则
1.如果要更改原值,就使用指针接收者,如果要创建一个新值,就使用值接收者