微信号:fed-talk

介绍:公众号开通于2016年,内容起于前端而不止于前端.

Go struct interface

2018-04-09 14:49 icepy

感觉在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应用,空接口就是返回类型,这一点上,很重要。




长按二维码关注公众号:

你也可以关注我的新浪微博,搜索i_icepy,很期待和大家交流

 
象尘说 更多文章 离开,是为了将生活过成自己想要的样子 Go,从现在开始 Android远程调试Web页面 Github最有用的前端Awesome 小程序的乐趣
猜您喜欢 阿里科技下午茶:手淘背后的人工智能以及未来思考 服务注册和服务发现-Eureka的常用配置 万达融创大交易:中国房市的财富乾坤大挪移,走到了终结阶段? 【第2章第186回】js函数的一些难点 Andrew Ng\/徐伟谈人工智能发展的现状与未来