首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go struct interface

Go struct interface

作者头像
icepy
发布2019-06-24 20:30:30
7380
发布2019-06-24 20:30:30
举报
文章被收录于专栏:子曰五溪子曰五溪

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


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 子曰五溪 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档