分享
  1. 首页
  2. 文章

interface

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

interface是什么

interface被称为接口,是一种类型,其本质是一组抽象方法的集合。凡是实现这些抽象方法的对象,都可以被称为"实现了这个接口"。其存在意义是为了规定对象的一组行为。

interface举例

package main
import (
 "fmt"
)
type Singer interface {
 sing()
}
type Man struct {
 lyric string
}
type Bird struct {
 lyric string
}
func (m Man) sing() {
 fmt.Println(m.lyric)
}
func (b Bird) sing() {
 fmt.Println(b.lyric)
}
func main() {
 var in Singer
 in = Man{"I'm a brave man"}
 in.sing()
 in = Bird{"I'm a small bird"}
 in.sing()
}

上述事例中我们定义了一个名为Singer的接口,它包含一个抽象方法sing()(当然也可以包含很多抽象方法)。接着我们又分别为Man对象和Bird对象实现了sing()方法,即这两个对象都实现了Singer接口。于是,这两种对象就都可以使用Singer接口对应的变量来存储了!使用这个接口变量就如同调用其对应的对象一样容易。

空interface

interface{} 是一个空interface,实现它不需要实现任何抽象函数,也就是说所有的类型都实现了空interface。于是,一个空interface变量可以存入任何值。实际的用处是,当不确定传入函数的参数类型时,可以使用interface{}代替。并且,我们有特定的语法可以判断具体存入interface{}变量的类型。

package main
import (
 "fmt"
 "reflect"
)
type Ele interface{}
type List []Ele
func main() {
 list := make(List, 4)
 list[0] = 1
 list[1] = 'c'
 list[2] = "string"
 list[3] = [2]int{5, 6}
 for index, val := range list {
 switch typeval := val.(type) {
 case int:
 fmt.Printf("list[%d] is an int(%d)\n", index, typeval)
 case string:
 fmt.Printf("list[%d] is a string(%s)\n", index, typeval)
 case rune:
 fmt.Printf("list[%d] is a rune(%c)\n", index, typeval)
 default:
 fmt.Printf("list[%d] is a different type(%s)\n", index, reflect.TypeOf(typeval))
 }
 }
}

注意:这种switch和val.(type)配合的语法是特有的,在switch以外的任何地方都不能使用类似于val.(type)这种形式。

一个特别的interface

我们很熟悉的fmt.Println函数中可以传入int、string、rune、array等多种类型作为参数,而控制台实际输出的字符串反映了每种类型的值。这就是因为它们都实现了源码中
Stringer接口,如下。

type Stringer interface {
 String() string
}

有趣的一点是,当我们定义一个新的数据类型时,如果也实现了Stringer这个接口,那么它同样也可以被fmt包格式化输出,并且是按照你所定义的格式。

package main
import (
 "fmt"
)
type Man struct {
 name string
 age int
}
func (m Man) String() (result string) {
 result = fmt.Sprintf("I'm a man. My name is %s and I'm %d years old.\n", m.name, m.age)
 return
}
func main() {
 man := Man{"Bob", 18}
 fmt.Println(man)
}
output:
I'm a man. My name is Bob and I'm 18 years old.

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

本文来自:Segmentfault

感谢作者:Dr_Zhang

查看原文:interface

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

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

用户登录

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

今日阅读排行

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

一周阅读排行

    加载中

关注我

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

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

给该专栏投稿 写篇新文章

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

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