分享
  1. 首页
  2. 文章

Go 面向对象概念

roger9567 · · 4171 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请注明出处!

1. 对象

- 任意简单的内置数据类型

- 任意复杂的结构体

- 表示具体的事物 / 抽象的规则 / 计划 / 事件 等.

2. 对象的状态

- 用数值来描述, 如长方体的长和宽等.

3. 对象的操作

- 用于改变对象的状态, 操作就是对象的行为.

- GO语言中称为Method(方法), Method 就是在 函数(function) 前面增加了一个接收者(Receiver)对象. 将操作和对象关联起来了.

- 定义: func (recv receiver_type) methodName(args)(rets){} Receiver 可以是: 内置类型/自定义类型/结构体/指针类型

- 多个Method可以同名, 只要接收者不同, 就是不同的Method.(类似于重载吧)

- Method可以访问接收者的字段, 而不需要将字段作为参数传入Method, 就像在struct中访问字段一样.

- 普通类型作为Receiver,是值传递; 指针类型作为Receiver, 将传递引用.

package main
import (
 "fmt"
 "math"
)
type rect struct {
 width int
 height int
}
type circle struct {
 radius float32
}
func (recv rect) area() int {
 return recv.width * recv.height
}
func (recv circle) area() float32 {
 return recv.radius * recv.radius * math.Pi
}
func main() {
 r1 := rect{4, 3}
 r2 := rect{30, 15}
 fmt.Println(r1.area(), r2.area())
 c := circle{5}
 fmt.Println(c.area())
}

- Receiver

- 匿名Receiver, 省略了receiver的名字(类型没有省,所以可以判断), 此时不能定义同名的方法(应该是会造成无法将操作和对象绑定).

- Method 继承

- go中可以通过匿名字段实现字段继承; 如果匿名字段实现了一个Method(或者说是这个Method的Receiver), 那么包含这个匿名字段的struct对象也能调用该Method.

- 可以重写继承的方法, 对象会像处理匿名字段一样, 优先处理外部同名Method.

4. 接口(Interface)

- 一组Method的组合, 可以通过Interface来定义对象的一组行为, 如果某个对象实现了某个接口的所有方法, 那么它就实现了该接口. 无须显式在该类型上添加接口说明.

- 习惯以 "er" 结尾, 如: Printer, Reader, Writer.

- 一个Interface中包含的Method不宜过多, 一般 0 - 3个

- Interface可以被任意的对象实现, 一个对象也可以实现多个 Interface.

- 接口组合

- 类似类型的匿名组合(如结构体, Method) ,接口也可以组合: 将一个/多个接口匿名嵌入另外一个接口中 , 就组合了接口.

type SpeakListener interface{
 Speaker // Speaker为一个匿名接口
 Learner // Learner 为一个匿名接口
}

- 空接口 : 任何数据类型都默认实现了空接口. interface {}

- 可以用来定义任意类型的参数和返回值. (有点儿像是void 和 void* 的用处吧) : 1. func f1(a interface{}){} 2. func f2(a ... interface{}){}

- 执行机制和赋值

- 接口是引用类型.(如何理解呢? )

- 接口是可以被实例化的类型, 当定义一个接口类型变量时, 系统会为其分配内存, 并将赋给它的对象赋值到这个内存区域.

- 接口对象(由 Itab指针和data指针组成)

struct Iface{ // C语言中的表示
 Itab * tab;
 void * data;
};

- Itab : 依据data类型创建, 存储了接口动态调用的元数据信息, 其中包括data类型所有符合接口签名的方法地址列表. 使用接口对象调用方法时就从Itab中查找对应的方法, 并将 *data 作为Receiver参数传递给该方法.

- 编译器在构建 Itab时, 区分T 和 * T 方法集, 病从中获取接口实现方法的地址指针, 接口调用不会做Receiver自动转换, 目标方法必须在接口实现的方法集中. 接口方法集规则:

- T 仅仅拥有T类型的方法集, 而 *T拥有(T+*T)方法集

- 基于T实现方法, 表示同事实现了interface(T) 和interface(*T) 接口

- 基于(*T)实现方法, 就只能是对 interface(*T)实现接口

- 接口的定义与赋值

- 定义了一个interface的变量, 那么变量里面可以存储实现了这个interface的任意类型的对象.

- 多个对象同时实现了这个接口的话, 那么可以用这个接口作为类型, 定义一个slice, 那么就可以写出比较少的代码. ix = make([]Speaker,3)

- 匿名字段方法和接口转换

- 当接口类型是struct时, 这些struct可能有匿名字段, 而为这些匿名字段定义的方法也会被接口所继承.

- 接口之间可以相互包含. == > 超级(范围大) + 子集(范围小)


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:roger9567

查看原文:Go 面向对象概念

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4171 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏