k8s visitor

这是一种将算法和数据结构分离的编程模式。

type Visitor func(shap Shap)

type Shap interface{
  Accept(Visitor)
}

我们创造一个函数类型,它接受一个接口作为参数。

我们定义刚才那个接口,并且在接口中我们定义一个函数,这个函数中的参数是刚才的函数类型。

type result1 struct {
  data int
}
func(r result1) Accept(v Visitor) {
  v(r)
}

type result2 struct {
  data int
  name string
}
func(r result2) Accept(v Visitor) {
  v(r)
}

我们实现了两个 struct。

接下来,我们定义一些函数,这些函数是 visitor 函数。

func n1(shap Shap) {
  fmt.Println(shap)
}
func n2(shap Shap) {
  fmt.Println(shap)
}

接下来我们在 mian 函数中调用这个 visitor 函数。

func main(){
  r1 := result1{1}
  r2 := result2{2, "shgopher"}
  result := []Shap{r1, r2}
  for _, v := range result {
    v.Accept(n1)
    v.Accept(n2)
  }
}

数据是 r1,和 r2,算法是 n1 和 n2,这样,我们就可以将算法和数据给分开,互相不会有耦合。