go学习笔记(3) — interface

interfacce 翻译过来即是接口,这是种非常抽象的定义,即鸭子类型。(当一只鸟,会鸭子一样叫,会鸭子一样走路,会鸭子一样飞,我们就把它称作为鸭子)

interface

示例如下

1
2
3
4
5
6
func (h human) sayHi(){
fmt.Printf("Hi I am %s",h.name)
}
type men interface {
sayHi()
}

这时候我们定义好了一个 men的接口,并把sayhi()方法添加进了该接口。接下来我们看看这个是怎么使用的。

1
2
3
4
5
func main(){
t := teacher{human{"jack", 18, MALE}, "school"}
m := men(t)
m.sayHi()
}

输出如下

1
Hi I am jack

可以发现,我们定义好了一个 men 接口 ,并用 teacher 方法实现了接口的调用。注意,此时 teacherhuman的除sayHi() 以外的方法都不能在 men 中调用,虽然这句有点废话,但是如果注意到这一点,也就知道 interface 这一定义的一大用处了。

go 的 public 和 private 实现并没有关键字,要靠定义方法的大小写来判断,如果我们的men接口是要对外开放的,我们就要把 men 改成 Men

interface 还有一个有趣的用法,即空接口,当一个接口为空的时候,即 interface{} , 把该接口作为参数传入func,也就可以接受任何类型的值,当func返回值设置为interface{} 时,即可代表可返回任何类型的值,非常实用。

fmt.Println 是我们常用的打印函数,当你打开他的源码定义是,即可看到

1
2
3
type Stringer interface {
String() string
}

即任何 String 方法都能被作为参数被 fmt.Println 调用。

我们为 human 添加定义

1
2
3
func (h human) String() string{
return h.name
}

然后调用

1
2
3
4
func main(){
Jacky := human{"jacky",18,MALE}
fmt.Println("My name is",Jacky)
}

输出结果应该猜到了,所以我就不再贴log了。