前言
在Go语言中,并没有类的概念,但这并不意味着Go语言不支持面向对象编程,毕竟面向对象只是一种编程思想。
封装
属性
其实,学习过C语言都应该清楚,结构体是一个类类的结构,也就是说结构体是类的一种简化形式。所以,如果我们需要使用Go语言定义一个三角形类,可以这样写:
type Triangle struct { Bottom float32 Height float32 }
方法
既然有了类,那类的方法如何定义呢?其实Go语言中,也有方法。
方法是作用在接收者上的一个函数,接收者是某种类型的变量。因此,方法是一种特殊类型的函数。示例如下:
//语法 func (recv recv_type)methodName(parameter_list)(return_value_list){ //方法内容 } //示例 type Triangle struct { Bottom float32 Height float32 } func (t *Triangle) Area() float32 { return (t.Bottom * t.Height) / 2 } func main() { r :=Triangle{6,8} fmt.Println(r.Area()) }
以上代码运行的结果为:24
访问权限
在许多面向对象的语言中,属性与方法都有私有与公有的区别,这就是访问权限。比如Java,可以用public、private来定义访问权限。
但Go语言肯定是没有public与private,它是通过字母大小写来控制访问权限的。大家也会发现,我们上面的Bottom与Height都是大写,所以大写是公有属性,小写是私有。
这里就不举例了,大家可以通过编译器试试,可以发现小写的,根本不会提示。强制写入代码运行,肯定也会报错。
另外,我们还常常在Java语言的实体类中,定义get与set方法。下面,我们来通过Go语言实现get与set方法:
type Triangle struct { bottom float32 height float32 } func (s *Triangle) GetBottom() float32 { return s.bottom } func (s *Triangle) SetBottom(bottom float32){ s.bottom=bottom } func main() { r :=Triangle{6,8} r.SetBottom(8) fmt.Println(r.GetBottom()) fmt.Println(r.bottom,r.height) }
继承
在Go语言中,同样也没有继承关键字extend,而是使用在结构体中内嵌匿名类型的方法来实现继承。例如,顶一个动物接口和一个老虎结构体,让老虎结构体包含一个动物接口的匿名字段。
type Animal interface { GetName() SetName() } type Tiger struct { Animal } func (t *Tiger) Working() { t.GetName() t.SetName() }
多态
在面向对象中,多态的特征是不同对象中同种行为的不同实现方式。在Go语言中,可以使用接口实现这个特征。示例如下:
//三角形结构体 type Triangle struct { Bottom float32 Height float32 } //正方体结构体 type Cube struct { sideLen float32 } //定义了一个包含Area()方法的接口Shape,让三角形与正方行都实现这个接口里的Area()方法。 type Shape interface { Area() float32 } func (t *Triangle) Area() float32 { return (t.Bottom * t.Height) / 2 } func (c *Cube) Area() float32 { return c.sideLen * c.sideLen } func main() { r :=&Triangle{6,8} c :=&Cube{5} s :=[]Shape{r,c} for n,_ :=range s{ fmt.Println("图形数据:",s[n]) fmt.Println("图形面积",s[n].Area()) } }
如上面代码所示,通过不同对象调用Area()方法,产生了不同的接口,间接实现的多态。