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{}变量的类型。 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",typeval) case rune: fmt.Printf("list[%d] is a rune(%c)n",typeval) default: fmt.Printf("list[%d] is a different type(%s)n",reflect.TypeOf(typeval)) } } }
我们很熟悉的fmt.Println函数中可以传入int、string、rune、array等多种类型作为参数,而控制台实际输出的字符串反映了每种类型的值。这就是因为它们都实现了源码中 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |