前端之家收集整理的这篇文章主要介绍了
Golang面向对象之类型、方法、多态,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Golang面向对象之类型、
方法、多态 一、
方法与
函数 什么是
方法?与
函数的区别?
方法就是能够处理某种类型的变量或结构(以下结构也统称为变量)的
函数,称为该类型的
方法 这意味着,这个变量会传给这个
函数,并且这个
函数认识这个变量的内部构造 怎样使得一个
函数成为一个类型的
方法? java和cpp将指向该类型变量的“this”指针作为隐含参数传入该
函数 go将该类型变量的拷贝、或者指向该类型变量的指针作为“接收者”传入该
函数 java和cpp将该
函数藏在类中,以防止外界轻易访问 go中
方法可以放置在任意位置 为什么需要一个
函数成为一个类型的
方法? 原因之一:多态性 如果只有独立分散的
函数来处理各种类型,那么会有int_print(int a)、string_print(string a)、person_print(Person a)等等 如果把处理
函数隐藏在类型中,则可以全部叫print()而不会名字冲突,这使得多态性成为可能:任意类型变量.print() 原因之二:安全性
函数藏身在类型中,可以对外只开放有限的访问权 二、完整地描述客观世界的实体 不仅仅实体本身的构造,还
包括给实体配备的
方法 实体本身的构成 汽车由发动机、油箱、车轮、车厢、方向盘构成 实体拥有的
方法 拉货、加油、修车 广义地讲,不仅仅结构,原始类型,比如int,也是如此,包含一个值,以及加减乘除等
方法,而string包含裁剪和连接等
方法 不同语言对实体的描述 java、cpp通过类 类里面有各种变量数据 类里面有各种
方法,这些
方法通过this指针
修改和处理类对象 go 通过原始类型或struct来描述单一或复杂实体的内部变量 类型变量通过“接收者”传递给
函数,使得
函数成为该类型的
方法 也即一样有内部变量数据和可以操作这些变量的
方法 三、Go的实体类型及其
方法分类 注意,本质上Go仅仅有值拷贝传递。引用传递或指针传递在实际上都是指针的值拷贝传递 相当于值拷贝传递和指针传递被显式地区分开了 这样的好处是什么?可能是值传递缺省的安全,因为原变量不可能被
修改 坏处是什么?要想通过
方法修改一个变量或字段,必须
增加一个指针字段来指向它? 或者只是
增加传递指针的
方法,使用“&字段名”来
调用? 实体类型T var i T 值拷贝传递后,
方法拿到的是i的值拷贝,因此可能的
方法包括所有接收者为T型的
函数。原始的T型变量不可能被
修改 指向实体类型的指针 var i *T 值拷贝传递后,
方法拿到的是指向T型变量的指针i,因此可能的
方法包括所有接收者为*T的
函数,
修改“*i”时会
修改原始的T型变量 由于拿到i后,还可以通过“v = *i”来
生成一个等值拷贝的T型变量 因此本类指针的
方法还能
包括所有接收者为T型的
函数,自然原始变量也不会被
修改 Go规范的英文原文是: Such a function indirects through the receiver to create a value to pass as the receiver to the underlying method; the method does not overwrite the value whose address is passed in the function call. 感觉是这个意思: func(tv *T,a int) int { var v v = *tv // 在
函数的开头
生成了一个局部变量v return func_real(v,a) // 余下的
代码使用局部变量v,而不是“*tv”所指向的值 } interface接口类型 var i I 此刻的i完全不同于实体变量或其指针 i本质上是一指针,可以指向任何包含了接口I的变量 i的
方法就是接口I包含的
方法 四、interface接口 什么是interface? interface是一个接口,规定了一组
方法的外观,或说
调用格式,但不实现这些
方法 类似
文件系统的接口,无论底层是什么
文件格式,总有open()、close()、read()、write() 凡是有open()、close()、read()、write()这组interface的任何IO设备均可看成
文件系统 由此形成了多态性 通过interface来对实体按外部
方法配备进行
分类 type 软件工程师 interface { java编程() go编程() 加班() 写文档() } type 产品设计师 interface { UI设计() 绘画() } interface变量 可能是一个指针,可以指向任何实现了该interface的实体,而不管实体本身是怎样的 var i 软件工程师 // 以后 i 可以指向任何软件工程师,可能是任何实体,不局限于人 i = 小明 // 或小王、火星人、机器人、一条聪明的狗,只要会java和go编程,会写文档会加班 var j 产品设计师 // 以后 j 可以指向任何产品设计师,可能是任何实体,不局限于人 j = 小张 // 也可能是小明,或其他任何人,或动物或狗,只要懂UI设计,懂绘画