interface

interface是什么函数

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

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)这种形式。string

一个特别的interfaceit

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

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.
相关文章
相关标签/搜索