go的interface实践

这是第二个我在别的语言里面没有见过的实现,go的interface可以说是独树一帜,让我们仔细来实践一下。

interface类型是什么?interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。

还是先来看一个例子:

package main

import "fmt"

type Human struct {
    name string
    age int
    phone string
}

type Student struct {
    Human
    school string
    loan float32
}

type Employee struct {
    Human
    company string
    money float32
}

//Human 对象实现Sayhi方法
func (h Human) SayHi() {
    fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
}

//Human 对象实现Sing方法
func (h Human) Sing(lyrics string) {
    fmt.Println("La la, la la la, la la la ...", lyrics)
}

func (h Human) Guzzle(beerStein string) {
    fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
}

func (e Employee) SayHi() {
    fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name, e.company, e.phone)
}

type Men interface {
    SayHi()
    Sing(lyrics string)
    Guzzle(beerStein string)
}

func main() {
    var tt Men
    e := Employee{Human{name: "piperck", age: 25, phone: "182020912309"}, "xcf", 1}
    tt = e
    fmt.Println(tt)
}

直接看到main函数的地方,我们申明一个Men接口变量tt,然后可以看到,由于Employee通过继承实现了Men接口里面定义的三个函数,所以他可以被赋值给Men类型的任何变量之中。

另外还有一种特别的interface,空interface,空interface(interface{})不包含任何的mehod里面,正因为如此所有类型都实现了空的interface接口。空interface可以存储任意类型的数值。

总结一下就是,只要你实现了这个interface里面定义的方法,那么你就实现了这个interface。申明的这个interface变量就可以存储你的变量类型。 打个比方就是,fmt.Println函数接收一个指定的interface当参数,如果你实现了这个指定interface的所有方法,你就可以将这个实现了interface的东西传给fmt.Println!

Reference:

Go Web编程-谢孟军

时间: 2024-10-20 07:23:48

go的interface实践的相关文章

20182333 2018-2019-1《程序设计与数据结构》课程总结

20182333 2018-2019-1<程序设计与数据结构>课程总结 前言 转眼间,一个学期转眼间也已经过去了,回想起来这几个月的学习时光,有欢乐,也有汗水,有喜悦,也有痛苦.经历了第一次写出代码能运行成功的雀跃,也饱受在深夜写不出代码不能实现功能的苦恼.在这段时间里,我学习到了很多,也成长了很多.最后我也有模有样的进行了一次小组合作.在进行小组协作的那段时间内,虽然自己许多都不会,但在和小组成员一些学习努力实现app的功能还是很有收获的,最后app成功实现的时候还是非常开心的,也确是得到了

go语言中interface的实践

package main import ( "fmt" "math" ) type geometry interface { area() float64 perim() float64 } type square struct { width, height float64 } type circle struct { radius float64 } //要在go中实现一个接口,我们只需要实现接口中的所有方法 //`square`的实现,s接收者接受了area(

php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这样的.所以基本的显得额外重要,即是算法和数据结构,再就是好的设计模式了,,,听过一句话,是好的数据结构是让计算机更快的工作,而一个好的设计模式则是使开发者工作的更快! 单例模式 单例模式特点 $_instance 必须声明为静态的私有变量 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去

VS2010 Extension实践(2)

在上一篇(VS2010 Extension (1)实践)里,主要展示了如何使用MEF扩展VS2010,来扩展编辑控制和展现自己的UI:在实现QuickToolbar的时候,发现MEF仅仅提供了很基本的编辑控制,如果需要高级的操作,比如注释选择的代码,就捉襟见肘,很是麻烦. 本篇我将展示如何深入挖掘VS2010 Extension,使它成为锋利的军刀,而不是绣花枕头.鉴于此,这里就从上面提到了的Feature--注释和取消注释选择的代码来剖析,希望可以为大家拓宽思路,更好的利用VS2010. 首先

运维自动化工具Cobbler之——安装实践

运维自动化工具--Cobbler实践 第1章 About Cobbler 1.1 Cobbler Introduction Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装.重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等. Cobbler可以使用命令行方式管理,也提供了基于Web的界面管理工具(cobbler-web),还提供了API接口,可以方便二次开发使用.Cobbler是较早前的kickstart的升级版,优点是比较容易配置,还自带web

基于Neutron的Kubernetes SDN实践经验之谈

首先,向大家科普下Kubernetes所选择的CNI网络接口,简单介绍下网络实现的背景. CNI即Container Network Interface,是一套容器网络的定义规范,包括方法规范.参数规范.响应规范等等.CNI只要求在容器创建时为容器分配网络资源.删除容器时释放网络资源.CNI与调用者之间的整个交互过程如下图所示: CNI实现与外界的交互都通过进程参数和环境变量传递,也只要求输出结果符合CNI规范即可,与实现语言也没什么特殊要求.比如Calico早期版本就使用Python实现了CN

Hangfire项目实践

Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(Delayed jobs) 定时任务执行(Recurring jobs) 延续性任务执行(Continuations) 与quartz.net对比 Hangfire扩展 Hangfire Dashborad日志查看 Hangfire Dashborad授权 IOC容器之Au

Glow Android 优化实践

了解 Glow 的朋友应该知道,我们主营四款 App,分别是Eve.Glow.Nuture和Baby.作为创业公司,我们的四款 App 都处于高速开发中,平均每个 Android App 由两人负责开发,包括 Android 和 Server 开发,在满足 PM 各种需求的同时,我们的 session crash free 率保持不低于 99.8%,其中两款 App 接近 100%. 本文将对 Glow 当前 Android App 中对现有工具的探索及优化进行讲解,希望对读者有所启发. 整体结

本地事务和分布式事务工作实践 【转】

一:从事务的历史说起 知已知彼,百战不败.想了解事务,我们从事务的历史说起. 在Windows平台上,事务的概念最开始出现在关系型数据库中,但是随着.net平台的发展,事务包括的的范围也越来越宽,先一睹为快, 在关系型数据库中的事务是通过begin transaction,rollback transaction, commit 等关键字来实现事务的. BEGIN TRANSACTION  UPDATE [dbo].[T_ACCOUNT] SET BALANCE = BALANCE + @amo