专栏首页子曰五溪Go struct interface

Go struct interface

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


本文分享自微信公众号 - 子曰五溪(fed-talk)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • golang 自动下载所有依赖包

    大部分情况下大家下载 Go 项目都是使用go get命令,它除了会下载指定的项目代码,还会去下载这个项目所依赖的所有项目。

    landv
  • swoole 协程知识点小结

    swoole 一直保持着 颇为快速 的迭代速度, 快到什么程度呢 -- 「快别更新了, 学不动了」

    桶哥
  • golang-101-hacks(13)——Array

    注:本文是对golang-101-hacks中文翻译。 在Go语言中,长度值是数组类型的一部分。下面的代码声明了一个数组:

    羊羽shine
  • Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

    正确地认识 G , M , P 三者的关系,能够对协程的调度机制有更深入的理解! 本文将会完整介绍完 go 协程的调度机制,包含:

    _simple
  • 生信技能树R作业答案-中级

    ggpubr http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/

    Y大宽
  • 盘盘那些你不知道的大厂技术实践

    一家企业的技术研发能力,决定了这个企业的规模。而决定一家企业技术研发能力的,便是开发人员,这也是我们总戏称“要发家,做开发”的原因。

    乔戈里
  • 分享一些使用的谷歌浏览器插件

    使用浏览器扩展程序可以使你的工作效率提高数倍不止,那么下面我就向大家分享一下我日常使用的扩展,可能大多数扩展大家都已经在使用了,不过也难免有一两个是你不知道的。...

    帅地
  • 错误消息 This computer doesn't have VT-X/AMD-v enabled

    在VirtualBox的Ubuntu虚拟机里试图本地安装Kyma(一个基于Kubernetes的开源框架)时,遇到下面的错误信息:

    Jerry Wang
  • Kubernetes 最佳实践:解决长连接服务扩容失效

    在现网运营中,有很多场景为了提高效率,一般都采用建立长连接的方式来请求。我们发现在客户端以长连接请求服务端的场景下,K8S的自动扩容会失效。原因是客户端长连接一...

    imroc
  • 第9节 Go的执行原理以及Go命令

    命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,就会安装到 GOBIN ...

    小尘哥

扫码关注云+社区

领取腾讯云代金券