话接上文
隔壁王小猿:golang学习笔记之-Go语言基本语法zhuanlan.zhihu.com
隔壁王小猿:golang学习笔记之--Go语言内建容器zhuanlan.zhihu.com
如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复“Go语言基本语法”即可获得
面向对象
结构体与方法
- Go语言仅支持封装,不支持多态和继承
- Go语言没有class,只有struct
结构体的创建
- 不论地址还是结构本身,一律使用 . 来访问
- Root:=treeNode{value:3}
- Root.left=&treeNode{}
- Root.right=&treeNode{5,nil,nil}
- Root.right.left=new(treeNode)
- 示例
输出
工厂函数-模拟构造函数
给结构体定义方法
- 显示定义和命名方法的接收者
- 使用指针作为方法接收者
- 只有使用指针才可以改变结构内容
- nil指针也可以调用方法
- 示例
输出
值接收者vs指针接收者
- 要改变内容必须使用指针接收者
- 结构过大也考虑使用指针接收者
- 一致性,如果有指针接收者,最好都是指针接收者
- 值接收者是go语言特有的
- 值、指针接收者均可接收值、指针
包&封装
- Go语言通过名字来区分public和private
- 名字一般使用CamelCase
- 首字母大写 public
- 首字母小写 private
包
- 每个目录一个包
- mian包包含可执行入口
- main函数所在目录只能有一个main包
- 为结构定义的方法必须在同一个包内,可以是不同文件
包-扩充系统类型或者别人的类型
输出
GOPATH环境变量
- 默认~/go(linux,unix), %USERPROFILE%go(windows)
- 官方推荐:所有项目和第三方库都放在一个GOPATH下
- 也可以将每个项目放在不同的GOPATH
- Go get 命令获取包,也可以用gopm获取
- GOPATH下目录结构
面向接口
duck typing
先问一个比较考三观的问题:图片中的大黄鸭,它是不是一只鸭子呢?
Duck Typing 的原话是,走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就是一只鸭子。
这个原话是可以灵活理解的,就看我们怎么定义鸭子的行为,我们可以说,能浮在水上游的,黄色的,可爱的就是鸭子,那么,图片中的大黄鸭,它就是一只鸭子!
这就是所谓的 Duck Typing,它只关心事物的外部行为而非内部结构。它并不关心你这只鸭子是长肉的还是充气的。
Python中duck typing
- 运行时才知道传入的retriever有没有get
- 需要注释来说明接口
C++中的duck typing
- 编译时才知道传入的retriever有没有get
- 需要注释来说明接口
Java中类似代码
- 传入的参数必须实现Retriever接口,编写代码过程中就知道必须包含get方法
- 不是duck typing
Go语言中的duck typing
- 同时可以实现多个接口
- 具有python和c++ 的duck typing的灵活性
- 又具有Java的类型检查
- 类似duck typing
接口
接口的定义
接口的实现
接口变量里面有什么
- 接口变量自带指针
- 接口变量同样采用值传递,几乎不需要使用接口的指针
- 指针接收者实现只能以指针方式使用,值接收者都可
查看接口变量
- 表示任何类型:interface{}
- Type Assertion
- Type Switch
接口组合
面向函数
闭包
adder函数返回的是一个闭包,不仅仅是一个函数,还包含sum的引用等