go学习 四
面向对象

go语言特点

初始化
main 结构体中包含匿名字段


运行结果 定义的有内容,未定意的值为0

成员操作

也可以这样操作

同名字段

显式调用(有同名字段时,与上图相接)

运行结果


运行结果

结构体指针类型
两种给指针类结构体赋值方式

打印结果

面向对象和面向过程

结构体类型添加方法


运行结果

使用方法总结


值语义和引用语义
值语义
只是把值复制一份,在里边修改不会影响到外边 (通过打印结果可以看出,内存地址不同,运行函数之后,外部的数据也无变化)

换另一种方法

指针类型和普通类型的方法集

指针类型方法集

普通变量的方法集

方法的继承

运行结果 证明 可以继承此方法

方法的重写(与python的类继承类似,先找本身是否有此方法,有则就近,没有则继续往下调用)

方法值

运行结果

方法表达式(就是换了一种调用方法)

运行结果

鸭子类型
接口,不同类型根据不同类型对此接口定义的方法,调用的时候根据类型,调用接口后自动选择执行的内容



多态的表现
接上图

另外一种调用方法

接口的继承


main.go
package main import "fmt" type Human interface { sayhi() } type Person interface { Human sing(lrc string) } type Student struct { id int addr string } func (tmp *Student) sayhi() { fmt.Println(tmp.id, tmp.addr) } func (tmp *Student) sing(lrc string) { fmt.Println(lrc) } func main() { var i Person s := &Student{1, "beijing"} i = s i.sayhi() i.sing("学生歌") }
超集可以转换成子集,反过来不行

空接口(不包含任何方法的接口)

当函数是参数类型是空接口类型时,此函数就可以接受任意类型的参数,列入打印函数接收的参数就是这种情况

通过if实现快速类型断言( interface{} 的使用)

运行结果 证明空接口类型中可以放任何类型的变量

switch做类型断言


浙公网安备 33010602011771号