golang接口

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

定义

在 Go 中,关键字 interface 被赋予了多种不同的含义。每个类型都有接口,意味着对那个类型定义了方法集合 。

  • 这段代码定义了具有一个字段和两个方法的结构类型 S。
type S struct { i int }
func (p *S) Get() int { return p.i }
func (p *S) Put(v int) { p.i = v }
  • 可以定义接口类型,仅仅是方法的集合。
type I interface {
    Get() int
    Put(int)
}
  • 定义另外一个类型同样实现了接口 :
type R struct { i int }
func (p *R) Get() int { return p.i }
func (p *R) Put(v int) { p.i = v }
  • 类型判断-在 switch 之外使用 (type) 是非法的。类型判断不是唯一的运行时得到类型的方法。
func f(p I) {
    switch t := p.(type) {  //类型判断
    case *S: //p 的实际类型是 S 的指针
    case *R:  //p 的实际类型是 R 的指针
    case S:  //p 的实际类型是 S
    case R:  //p 的实际类型是 R
    default:  //实现了 I 的其他类型
    }
}
  • 为了在运行时得到类型,同样可以使用 “comma, ok” 来判断一个接口类型是否实现了某个特定接口:
if t, ok := something.(I) ; ok {
    // 对于某些实现了接口 I 的
    // t 是其所拥有的类型
}
  • 确定一个变量实现了某个接口,可以使用:

t := something.(I)

  • 空接口
    由于每个类型都能匹配到空接口: interface{}。
func g(something interface { }) int {
    return something.(I).Get()
}

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

本文来自:简书

感谢作者:程序小白菜

查看原文:golang接口

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

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