golang语法总结(二十二):接口interface

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

  • 类型关键字为interface
  • 不需要显式声明实现某个接口,只要实现相关方法就实现了接口
    基本示例:
type Person interface {
Name() string
}
type Student struct {
name string
}
func (s Student)Name() string {
return s.name
}
func main() {
var p Person
p = Student{name:"roc"}
fmt.Println(p.Name()) //roc
}
  • 接口也可以组合(相当于继承)
  • 可以试探是否为某个struct或interface的实例(ok pattern),相当于Java中的instanceof
type Person interface {
Name() string
}
type Teacher interface {
Person //接口组合
Teach()
}
type MyTeacher struct {
name string
class string
}
func (t MyTeacher)Name() string {
return t.name
}
func (t MyTeacher)Teach() {
fmt.Println("I am teaching ",t.class)
}
func say_hello(p Person) {
if m,ok := p.(MyTeacher);ok { //看此Person是否为MyTeacher的实例,如果是再执行if内的内容
fmt.Println("hello ",m.name)
}
}
func main() {
var t Teacher = MyTeacher{
name : "roc",
class : "english",
}
fmt.Println(t.Name()) //roc
t.Teach() //I am teaching english
say_hello(t) //hello roc
}
  • 可以使用匿名接口
var a interface{
Name() string
}

  • 空接口可以看作是所有struct都实现了的。匿名空接口直接写成:interface{}
  • type switch可以判断某变量是哪种类型,并根据不同类型作不同处理
type A struct {
a string
}
type B struct {
b string
}
func say_hello(m interface{}) {
switch t := m.(type) { //type switch的关键
case A:
fmt.Println("hello ",t.a)
case B:
fmt.Println("hello ",t.b)
default:
fmt.Println("nobody")
}
}
func main() {
a := A{a:"a"}
b := B{b:"b"}
say_hello(a) //hello a
say_hello(b) //hello b
}




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

本文来自:CSDN博客

感谢作者:QQ245671051

查看原文:golang语法总结(二十二):接口interface

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

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