面向接口的编程
Interface 类型可以定义一组方法,但是这些不需要实。并且interface不能包含任何变量,但是有参数。
好处是什么呢:定义好接口,然后各自去实现。去学习别人的接口。
实际项目中,最好抽象成接口,比如负载均衡,定义好轮训方法,直接换一下接口就好,底层怎么实现不管。这样就不需要改业务代码,就可以实现切换。
type exampler interface{
Method1(参数列表)返回值列表
Method2(参数列表)返回值列表
...
}
比如下面这个例子,就演示了多态:
package main
import (
"fmt"
)
//空接口
type Testnuller interface {
}
//接口1
type Tester interface {
sayHi()
}
//定义一个结构Studet
type Student struct {
name string
say string
}
func (s *Student) sayHi() {
fmt.Printf("student[%s,%s] sayhi \n", s.name, s.say)
}
//定义一个结构Teacher
type Teacher struct {
name string
say string
}
func (t *Teacher) sayHi() {
fmt.Printf("Teacher[%s,%s] sayhi \n ", t.name, t.say)
}
//定义一个类型
type myStr string
func (s *myStr) sayHi() {
fmt.Printf("myStr[%s] sayhi \n", *s)
}
//定义一个接口类型函数,输出是什么实现了这个接口
func WhoSayHi(i Tester) {
i.sayHi()
}
func main() {
s := &Student{"mike", "sgo"}
t := &Teacher{"teacher", "tgo"}
var str myStr = "hello world"
//调用一个函数,不同表现
WhoSayHi(s)
WhoSayHi(t)
WhoSayHi(&str)
//定义一个切片,存接口
x := make([]Tester, 3)
x[0] = s
x[1] = t
x[2] = &str
for _, i := range x {
i.sayHi()
}
}
运行结果:
PS F:\go\src\go_dev> .\main.exe
student[mike,sgo] sayhi
Teacher[teacher,tgo] sayhi
myStr[hello world] sayhi
student[mike,sgo] sayhi
Teacher[teacher,tgo] sayhi
myStr[hello world] sayhi
PS F:\go\src\go_dev>
PS F:\go\src\go_dev>
2019年12月18日 今天天气很不错
早上因为esix服务器宕机,导致工作受影响,一波操作,恢复时,已经是中午时分。
继续处理openstack vm kube-master问题,恢复了实例后,发现个镜像缺失,却不知道需要哪些镜像。这个在以后工作中需要注意下:
就以今天的实例启动后的作为梳理案例:
kube-master节点需要启动,需要确认的服务有以下几个:
服务有三类:system服务相关,rkt服务相关,docker服务相关。
一、sysem服务相关:
oem-cloudinit.service服务是否正常。
kubelete服务是否已经启动。
二、rkt服务相关:
/hyperkube 目录下文件是否已经存在。
是否还需要手动拷贝到目录下。
所需镜像有哪些。
三、docker相关:
kubelete拉起的服务比如apiserver,controlmanager ,schedule等。
docker 需要的镜像。
切记梳理环境,一定要做到细致,根据流程或者业务或者角色组件来。还有步骤一定要细致!!!!
今日份鸡汤:早点睡~