前言
go语言是静态类型语言,也就是在编译时编译器需要知道程序中值的类型,这样有利于减少bug和提高性能,具体就是内存的分配量和其中的内容
用户定义类型
1.用户定义新的类型,需要使用type 和struct关键字
type user struct {
name string
email string
phone 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 user
level 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.如果要更改原值,就使用指针接收者,如果要创建一个新值,就使用值接收者
数值类型、字符串类型和布尔类型都是内置类型,在对其进行修改或删除时,会创建一个新值,而在作为方法参数传递时,则会传递一个副本
这个函数时计算当前时间的,它创建time,然后返回它的副本,没有采取共享的方式,因为时间应该是给定一个时间点,不能被修改的
而这个函数,返回指向值得指针,因为File类型得值具有非原始得本质
2.使用值接收者还是指针接收者,不应该由该方法是否修改了接收到的值来决定。这个决策应该基于该类型的本质。这条规则的一个例外是,需要让类型值符合某个接口的时候,即便类型的本质是非原始本质的,也可以选择使用值接收者声明方法。
接口
多态是指根据不同类型实现不同行为,以io接口为例
23行通过get函数,完成了curl的操作