go语言仅支持封装,不支持继承和多态;没有class只有struct.
类型与接口关系
一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。
Go语言中不同的类型可以实现同一个接口
接口的主要工作是仅提供由方法名、输入参数、返回类型组成的方法签名集合。由类型(例如结构体)来声明方法并实现他们。如果一个类型实现了在接口中定义的签名方法,则称该类型实现该接口。
因为是动态,我们可以为不同类型分配新的结构,也实现接口。通过动态保持对基础类型的引用,接口也是以类似的方式工作。
空接口
当接口没有方法时,它被称为空接口。 这由interface{}表示。 由于空接口没有任何方法,空接口类型的变量可以存储任意类型的变量。。
类型断言
可以使用语法i.(Type)找出接口的基础动态值,其中i是接口,Type是实现接口i的类型。 Go将检查i的动态类型是否与Type相同。这样就可以将没有实现的接口实现。switch中
在类型断言语法i.(Type)中,如果Type没有实现接口(类型)i那么go编译器会抛出错误。 但是如果Type实现了接口,但是我没有Type的具体值,那么go将在运行时出现混乱。
另一种类型断言语法的变体,即
value, ok := i.(Type)
在上面的语法中,我们可以检查使用ok变量,如果Type实现接口(类型)i,我有具体类型Type。 如果是,那么ok将为true,否则为false,value为struct的零值。
接口不能实现其他接口或扩展它们,但我们可以通过合并两个或多个接口来创建新接口。
嵌入式接口也必须实现该接口;
接口变量自带指;接口变量采用值传递,几乎不使用指针传递;指针接受者实现只能以指针的方式使用,值接受者都可以;
多态
GO语言通过接口模拟多态。
goroutine 和主线程一样 并驾齐驱 是并发执行的, 需要交出控制权,如果不交出就会出现死机的情况,异步io/runtime.Gosched()/select(default)/channel/函数调用;channel也可以加缓冲区make(chan int , 3);channel 是可以close的,这是发送方决定的,接收方可以通过 n, ok := <- c来判断 也可以通过 for n := range c {}来判断,发送完就不接受了,async waitGroup等待多任务结束