golang 接口_golang学习笔记之-面向对象、面向接口与面向函数

0219a565699d8dec17624d5f007619af.png

话接上文

隔壁王小猿:golang学习笔记之-Go语言基本语法​zhuanlan.zhihu.com
cfd67f4ecace4128e4b34d0127b47e52.png
隔壁王小猿:golang学习笔记之--Go语言内建容器​zhuanlan.zhihu.com
cfd67f4ecace4128e4b34d0127b47e52.png

如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复“Go语言基本语法”即可获得

面向对象

结构体与方法

  • Go语言仅支持封装,不支持多态和继承
  • Go语言没有class,只有struct

结构体的创建

  • 不论地址还是结构本身,一律使用 . 来访问
  • Root:=treeNode{value:3}
  • Root.left=&treeNode{}
  • Root.right=&treeNode{5,nil,nil}
  • Root.right.left=new(treeNode)
  • 示例
var 

输出

{

工厂函数-模拟构造函数

  • 返回的局部地址
func 

给结构体定义方法

  • 显示定义和命名方法的接收者
  • 使用指针作为方法接收者
    • 只有使用指针才可以改变结构内容
    • nil指针也可以调用方法
  • 示例
type 

输出

root 

值接收者vs指针接收者

  • 要改变内容必须使用指针接收者
  • 结构过大也考虑使用指针接收者
  • 一致性,如果有指针接收者,最好都是指针接收者
  • 值接收者是go语言特有的
  • 值、指针接收者均可接收值、指针

包&封装

  • Go语言通过名字来区分public和private
  • 名字一般使用CamelCase
  • 首字母大写 public
  • 首字母小写 private

  • 每个目录一个包
  • mian包包含可执行入口
  • main函数所在目录只能有一个main包
  • 为结构定义的方法必须在同一个包内,可以是不同文件

包-扩充系统类型或者别人的类型

  • 定义别名
    • 使用别名myTreeNode封装TreeNode
type 

输出

2
0
0
5
3
  • 使用组合
    • 使用int组合实现queue
package 

GOPATH环境变量

  • 默认~/go(linux,unix), %USERPROFILE%go(windows)
  • 官方推荐:所有项目和第三方库都放在一个GOPATH下
  • 也可以将每个项目放在不同的GOPATH
  • Go get 命令获取包,也可以用gopm获取
  • GOPATH下目录结构
    • Src
      • Git rep1
      • Git rep2
    • Pkg
      • Git rep1
      • Git rep2
    • Bin
      • 可执行文件

面向接口

duck typing

先问一个比较考三观的问题:图片中的大黄鸭,它是不是一只鸭子呢?

ac67fc263d7b60b411ed0ec4eb84e3e1.png

Duck Typing 的原话是,走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就是一只鸭子。

这个原话是可以灵活理解的,就看我们怎么定义鸭子的行为,我们可以说,能浮在水上游的,黄色的,可爱的就是鸭子,那么,图片中的大黄鸭,它就是一只鸭子!

这就是所谓的 Duck Typing,它只关心事物的外部行为而非内部结构。它并不关心你这只鸭子是长肉的还是充气的。

Python中duck typing

Def 
  • 运行时才知道传入的retriever有没有get
  • 需要注释来说明接口

C++中的duck typing

Template
  • 编译时才知道传入的retriever有没有get
  • 需要注释来说明接口

Java中类似代码

<
  • 传入的参数必须实现Retriever接口,编写代码过程中就知道必须包含get方法
  • 不是duck typing

Go语言中的duck typing

  • 同时可以实现多个接口
  • 具有python和c++ 的duck typing的灵活性
  • 又具有Java的类型检查
  • 类似duck typing

接口

  • Go语言接口是由使用者定义的

接口的定义

type 

接口的实现

  • 接口的实现是隐式的
type 

接口变量里面有什么

  • 接口变量自带指针
  • 接口变量同样采用值传递,几乎不需要使用接口的指针
  • 指针接收者实现只能以指针方式使用,值接收者都可

查看接口变量

  • 表示任何类型:interface{}
  • Type Assertion
  • Type Switch

接口组合

type 

面向函数

闭包

a3b0582b7fa7624c0bd5b3dc1c4468c4.png
func 

adder函数返回的是一个闭包,不仅仅是一个函数,还包含sum的引用等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值