Go Interface概念
简单地说 Interface是一组Method的组合,可以通过Interface来定义对象的一组行为。
如果某个对象实现了某个接口的所有方法,就表示它实现了该借口,无需显式地在该类型上添加接口说明。Interface是一个方法的集合,它里面没有其他类型变量,而且Method只用定义原型 不用实现
实现一个动物的接口:
package main import "fmt" // 定义一个 Animal接口
type Animal interface {
Eat()
Talk()
Run()
} // Dog 实现了Animal的所有方法,就可以说Dog实现了Animal这个接口
type Dog struct {
name string
} func (d *Dog) Eat() {
fmt.Printf("%s is Eating...\n", d.name)
} func (d *Dog) Talk() {
fmt.Printf("%s is Talking...\n", d.name)
} func (d *Dog) Run() {
fmt.Printf("%s is Running...\n", d.name)
} func main() {
var dog = &Dog{
name: "WangCai",
} var a Animal
a = dog
a.Run()
a.Eat()
a.Talk()
}
实现一个雇员的接口
package main
import "fmt"
type Employee interface {
Calc() float32
}
type Developer struct {
Name string
Base float32
}
func (d *Developer) Calc() float32 {
return d.Base
}
type PM struct {
Name string
Base float32
Option float32
}
func (p *PM) Calc() float32 {
return p.Base * p.Option
}
type Operation struct {
Name string
Base float32
Option float32
Ratio float32 // 0.5 - 3
}
func (o *Operation) Calc() float32 {
return o.Base * o.Option * o.Ratio
}
type EmployeeMgr struct {
employeeList []Employee
}
func (e *EmployeeMgr) Calc() float32 {
var sum float32
for _, v := range e.employeeList {
sum += v.Calc()
}
return sum
}
func (e *EmployeeMgr) AddEmployee(d Employee) {
e.employeeList = append(e.employeeList, d)
}
func main() {
var e = &EmployeeMgr{}
dev := &Developer{
Name: "alex",
Base: ,
}
e.AddEmployee(dev)
pm := &PM{
Name: "Jim",
Base: ,
Option: ,
}
e.AddEmployee(pm)
oper := &Operation{
Name: "Miles",
Base: ,
Option: ,
Ratio: 1.2,
}
e.AddEmployee(oper)
sum := e.Calc()
fmt.Printf("the sum is: %f", sum)
}
实现error interface
// builtin.go 中的error interface
type error interface {
Error() string
}
package main import (
"time"
"fmt"
) type MyError struct {
When time.Time
What string
} // MyError实现了 Error 这个方法,也就实现了error interface
func (e MyError) Error() string {
str := fmt.Sprintf("at %v, %s", e.When, e.What)
return str
} // 直接返回MyError对象
func run() error {
myError := MyError{time.Now(), "it didn't work"}
return myError
} func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}
Go Interface概念的更多相关文章
- Java 基础 面向对象: 接口(interface )概念 以及接口之练习3 -定义一个接口用来实现两个对象的比较并 判断instanceof是否为同类
接口(interface )概念概念笔记 及测试代码: /** 面向对象: 接口(interface ) 是与类并行的一个概念: * 1.接口可以看成一个特殊的抽象类,它是常量与抽象方法的一个集合 * ...
- Go语言的接口interface、struct和组合、继承
Go语言的interface概念相对于C++中的基类,通过interface来实现多态功能. 在C++中,当需要实现多态功能时,步骤是首先定义一个基类,该基类使用虚函数或者纯虚函数抽象了所有子类会用到 ...
- `Java`中`abstract class`与`interface`区别
abstract class Java中允许使用abstract修饰符声明方法,此时只定义方法但是不实现方法(abstract修饰的方法没有主体,只有一个签名和一个分号). 以下是abstract方法 ...
- iOS开发60分钟入门
原文:https://github.com/qinjx/30min_guides/blob/master/ios.md 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的i ...
- Python3学习笔记2:简易Web爬虫
开发环境 基础语法那章的内容我是在Docker容器中玩的,但是真正做项目的时候,没有IDE的强大辅助功能来协助的话是很累人的一件事.因此从本文中,我选择使用Jetbrain的Pycharm这个IDE来 ...
- HttpClient4.2 Fluent API学习
相比于HttpClient 之前的版本号,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 为了方便使用,Flue ...
- windows生成库文件
库文件的生成,包括静态库lib与动态库dll,需要改变编译输出的生成命令,可以一开始生成对应的库工程(或者在工程属性->常规->配置类型更改). 附基本对应命令: gcc –c -L .o ...
- 【Golang 接口自动化02】使用标准库net/http发送Post请求
写在前面 上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单独拎了出来,我们在这一篇一起从源码来了解一下Golang的Post请求. 发送Post请求 net/h ...
- PHP中抽象类与接口的区别
PHP中抽象类与接口的区别 抽象类abstract 概念 定义为抽象的类不能被实例化.任何一个类,如果有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的类. 继承一个抽象类的时候,子类必须定义 ...
随机推荐
- window7电脑git设置快捷命令
平常git开发的一些命令来回重复的敲,有点麻烦,这里给git的常用的命令设置了快捷键,很方便开发. 我这个是window7环境,下面开始 1.home键 + r 打开运行窗口,点击确定进入黑窗口 2. ...
- 微信小程序 模块化
模块化也就是将一些通用的东西抽出来放到一个文件中,通过module.exports去暴露接口.我们在最初新建项目时就有个util.js文件就是被模块化处理时间的 /** * 处理具体业务逻辑 */ f ...
- 一个智障安装了一天的python和graphlab的血泪史
大概的过程是这样的: 先装了python3.6.1.,然后发现搞错了Σ(  ̄□ ̄||),是32 bit的,卸了重装python 3.6.1 (64bit). 然后装easy_install.pip.i ...
- ssh远程登录+查看系统版本+使用scp命令上传下载
ssh远程登录命令简单实例 ssh命令用于远程登录上Linux主机. 常用格式:ssh [-l login_name] [-p port] [user@]hostname 更详细的可以用ssh ...
- ios --图片文字组合头像那点事
/** 图片文字组合头像那点事 @param string 昵称 @param imageSize 图片尺寸 @param imageColor 图片颜色 @return 返回的 图片 */ + (U ...
- ios--后台返回信息有字符串和数字组成的,如何获取电话号码,让用户能够点击并且进行拨打?
-(void)callPhone:(NSString*)phoneNumber{ NSString *phoneStr=[NSString stringWithFormat:@"tel:// ...
- python tensorflow方法手记
Variable tf.Variable(initializer, name)给变量取名initializer是初始化参数,可以有tf.random_normal,tf.constant等.name就 ...
- Dmidecode
一.Dmidecode简介 DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行 ...
- vue起手式
主要步骤 安装node 安装npm 安装vue-cli(vue命令行工具) 初始化一个vue项目 进行开发 # 安装node # 安装npm # 安装cnpm,在中国大陆防止被墙 # 安装git # ...
- 【BZOJ2282】[Sdoi2011]消防 树形DP+双指针法+单调队列
[BZOJ2282][Sdoi2011]消防 Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这 ...