##封装 go中的封装和java的不太一样,在go里面是没有java中的class,不过可以把struct看成一个类,封装可以简单地看作对struct的封装,如下
type obj1 struct { valte1 string } type obj2 struct { valte2 string }
##继承 把struct看做类,struct中可以包含其他的struct,继承内部struct的方法和变量,同时可以重写,代码如下
package main import "fmt" type oo struct { inner ss1 string ss2 int ss3 bool } type inner struct { ss4 string } func (i *inner) testMethod(){ fmt.Println("testMethod is called!!!") } func main() { oo1 := new(oo) fmt.Println("ss4无值:"+oo1.ss4) oo1.ss4 = "abc" fmt.Println("ss4已赋值"+oo1.ss4) oo1.testMethod()//继承调用 oo1.inner.testMethod()//继承调用 这里也可以重写 }
##多态 go中的多台比java的隐匿得多,严格上说没有多态,但可以利用接口进行,对于都实现了同一接口的两种对象,可以进行类似地向上转型,并且在此时可以对方法进行多态路由分发,完全代码如下
package main import "fmt" type interfacetest interface { //testMothod1() string //testMothod()//这种会报语法错误 在go里面是不允许的 iMethod() //加上int则会报错 说明go的方法判断有返回值,而java没有 } type obj1 struct { valte1 string } type obj2 struct { valte2 string } //从属不同对象的testMothod 返回值不同的接口实现 func ( obj11 *obj1)iMethod(){ fmt.Println("testMothod go obj1") } //从属不同对象的testMothod 返回值不同的接口实现 func ( obj11 *obj2)iMethod() { fmt.Println("testMothod go obj2") } func gorun(ii interfacetest){ fmt.Println(ii.iMethod) } func main(){ var i interfacetest //interfacetest_ := new(interfacetest)//这种方式进行多台路由转发会报错 GO需先声明 如 var i interfacetest obj1_ := new(obj1) //赋obj1 i = obj1_ i.iMethod()//正确打印 gorun(i) gorun(obj1_) //interfacetest_.testMethod() //这种在java中允许,在go中是不允许的 //赋obj2 obj2_ := new(obj2) i = obj2_ i.iMethod()//正确打印 gorun(i) gorun(obj2_) list := [2]interfacetest{obj1_,obj2_} slice := []interfacetest{} slice = append(slice, obj1_) slice = append(slice, obj2_) for index,value := range slice { fmt.Println(index) fmt.Println(value) } fmt.Println(len(slice)) fmt.Println(len(list)) }