感觉在Go语言里接口是能处理任何事情的基石,虽然函数是一等公民,但是接口就像万能胶水一般,能承载任何事情。以往的语言,大家都讲OOP,但是在Go语言里,这里没有class也没有extend,看起来OOP是一个很难理解的事情。但是,我们有struct和interface,用这两个特性来代替处理继承,对象行为,抽象等等事情,这一点上,挺有趣的。
struct既可以有属性,也可以有方法,我可以用指针来传递,也可以copy副本来传递,有趣的例子是,能操作指针,让人可以更感觉到内存的真实所在的意义,这种体验,让我在JavaScript中很难体会。接口,可以定义一组方法集合(不实现),然后让别人来实现这一接口。不过,实现接口的方式并未像其他语言,比如Objectice-C一般,有一个关键字来指明(@implementation)实现,在.h文件中,定义好接口。但是,在Go语言中,你根本不需要使用关键字来指明,因为方法的实现,依赖前置接收原则,也就是说,你实现的方法(函数),谁来接收,那么就能说明是谁来实现了接口。
type ad struct{
admin int
}
type adI interface{
Outputer()
}
func (a *ad)Outputer(){}
咯,上面就是一个很简单的接口定义和接口实现,ad来实现了adI接口的Outputer方法。
在Go语言中,如果你想实现多态,那么接口是必然需要运用的一种方式,同一种类型在不同的实例上表现出不同的行为,这一点就很有趣了。
由于接口可以接收任意类型的值,在动态运行时里,去判断接口的类型就非常重要了。类型判断,可以在某些情况下,很舒服的完成某些事情,比如:
package main
type Sq struct {
side float32
}
type Ci struct {
q float32
}
type Sha interface {
Area() float32
}
func main(){
var shaI Sha
sq1 := &Sq{
side: 1.2,
}
shaI = sq1
if t, ok := shaI.(*Sq); ok {
fmt.Println("Sq 包含")
fmt.Println("%T", t)
}
if _, ok := shaI.(*Ci); ok {
fmt.Println("Ci 包含")
} else {
fmt.Println("不包含")
}
}
func (s *Sq) Area() float32 {
return 1
}
func (c *Ci) Area() float32 {
return 2
}
我认为学习Go语言,有两大精髓:struct和interface,其他的标准库在用的过程中边使用边查询,其实也可以。理解好结构体和接口,能很明白的知道,标准库该怎么用,一些框架的设计,是如何理解的。如果你来开发Web应用,空接口就是返回类型,这一点上,很重要。