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 概念 定义为抽象的类不能被实例化.任何一个类,如果有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的类. 继承一个抽象类的时候,子类必须定义 ...
随机推荐
- 浅谈.net平台下深拷贝和浅拷贝
在.net类库中,对象克隆广泛存在于各种类型的实现中,凡是实现了ICloneable接口的类型都具备克隆其对象实例的能力.所以本文讲述的深拷贝和浅拷贝也是在实现ICloneable接口的基础上进行的 ...
- Unity3D学习笔记——IDE菜单栏
一:菜单栏: 1.File: 2.Edit: 3.Assets: 4.GameObject: 5.Component: 6.Window: 7.Help:
- 循环遍历完成后再进行else判断
有时需要在循环遍历完后再进行else操作,通常的办法是在循环前设置一个flag,用于判断.具体例子如下:
- Android中android:layout_alignParentBottom标签不生效
Android中一个奇怪的问题 Android 6.0中android:layout_alignParentBottom设置后不生效. 详见:https://code.google.com/p/and ...
- 构造三层时报错“程序 “D:\MyTest\....”不包含适合于入口点的静态"Main"方法”
错误 1 程序“D:\MyTest\EBookShop\Model\obj\x86\Debug\Model.exe”不包含适合于入口点的静态“Main”方法 原因:原来创建项目的时候,用的是“空项目” ...
- JavaScript严格模式为何要禁用With语句
看了很多遍JavaScript严格模式,其中有说“禁用With语句”,以前看到这都是骑马观花,一带而过,因为平时就很少用到这个语句,禁不禁用对自己关系都不是很大.今天禁不住想知道为何“严格模式”就容不 ...
- [Spring MVC]学习笔记--form表单标签的使用
github例子地址: https://github.com/lemonbar/spring-mvc-jsp 效果图 关于spring mvc的标签的讲解, 有一篇blog已经讲的很细了. http: ...
- virgo使用指南
一.说明: 一个windows虚拟桌面软件,很小,不到10K,占用内存也极小.超级方便. 二.GitHub地址: henkman/virgo: Virtual desktops for Windows ...
- 理解CSS3属性transition
一.说明 1.1 定义和用法 transition 属性是一个简写属性,用于设置四个过渡属性: transition-property:规定设置过渡效果的CSS属性的名称. transition-du ...
- SQLServer与ASP中DATEDIFF函数区别
一.SQLServer: 格式: DATEDIFF(interval,startdate,enddate) interval参数: 年-yy,yyyy 季度-qq,q 月-mm,m 年中的日-dy,y ...