go语言中的interface使用实例
go语言中的interface是一组未实现的方法的集合,如果某个对象实现了接口中的所有方法,那么此对象就实现了此接口。与其它面向对象语言不同的是,go中无需显示声明调用了哪个接口。
package main
import (
"fmt"
)
type I interface {
Get() int
Put(int)
}
type S struct{ i int }
func (p *S) Get() int { return p.i }
func (p *S) Put(v int) { p.i = v }
type R struct{ i int }
func (p *R) Get() int { return p.i }
func (p *R) Put(v int) { p.i = v }
func f1(p I) {
fmt.Println(p.Get())
p.Put(1)
}
//interface{}空接口,能接受任何类型。.(I)是类型断言,用于转换something到I类型的接口
func f2(p interface{}) {
if t, ok := p.(S); ok {
fmt.Println("S:", t)
} else if t, ok := p.(I); ok {
fmt.Println("I:", t.Get())
}
}
func f3(p interface{}) {
switch t := p.(type) {
case S:
fmt.Println("S:", t.Get())
case R:
fmt.Println("R:", t.Get())
case I:
fmt.Println("I:", t.Get())
default:
fmt.Println("unknow type")
}
}
func main() {
s := S{101}
f1(&s)
f2(&s)
r := R{1111}
f3(&r)
}
如上结构S实现了I的两个方法,因此S实现了I。因为S实现了I,因此可以调用f向其传递S类型值得指针。 总结如下: (1)使用“comma, ok” 来判断一个接口类型是否实现了某个特定接口:
if t, ok := something.(I) ; ok {
// 对于某些实现了接口I 的
// t 是其所拥有的类型
}
(2)声明为 interface 类型的变量,可以存储任何实现了 interface 中所有方法的类型的变量 (3)空接口可代表任何类型,可做形参和返回类型
复制代码代码如下:
package main import "fmt" func main() { //interface{} var i interface{} = 100 var s interface{} = "hello" fmt.Printf("i = %d, s = %sn", i, s) s = i fmt.Printf("i = %d, s = %dn", i, s) }
(4)interface组合
将一个 interface1 嵌入到另一个 interface2 的声明中,其作用相当于把 interface1 的函数包含到 interface2 中,但是组合中不同有重复的方法
注: a. 只要两个接口中的方法列表相同(与顺序无关),即为相同的接口,可以相互赋值 b. interface1 的方法列表属于另一个 interface2 的方法列表的子集,interface2 可以赋值给 interface1,反之不成立(因为方法缺失),interface2 中的方法会覆盖 interface1 中同名的方法 c. 可以嵌入包中的 interface
- Kindergarten Counting Game
- React第三方组件1(路由管理之Router的使用②多层级跳转及重定向)
- 括号配对问题描述输入输出样例输入样例输出解析代码实现运行结果参考链接
- React第三方组件1(路由管理之Router的使用①简单使用)
- POj 2253 Frogger
- React项目配置7(ES7的Async/Await的使用)
- HDU 1863 畅通工程
- 最小生成树判断唯一
- React项目配置5(引入MockJs,实现假接口开发)
- POj 1611 The Suspects
- React项目配置4(如何在开发时跨域获取api请求)
- Laravel-博客实战+踩坑laravel-blog最终的效果踩的坑
- React项目配置3(如何管理项目API接口)
- React第三方组件3(状态管理之Flux的使用④TodoList下)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面试官想问的HashMap,都在这一篇里面了!
- CentOS7下使用Mondo Rescue实现系统全备份
- CentOS7下搭建Rsyslog Server记录远程主机系统日志
- 企业运维经典面试题汇总(4)
- 使用QEMU模拟树莓派Raspberry Pi
- Octave梯度下降法最优化代价函数的一个例子—ML Note 38
- Spring Boot入门系列(十八)mybatis 使用注解实现增删改查,无需xml文件!
- Mongodb多键索引之嵌套文档
- MySQL中的这几类日志,你一定要知道
- 微服务技术栈:API网关中心,落地实现方案
- 你的数据库服务器IO调度算法不对,难怪那么慢
- Android 11 强制用户使用系统相机?
- LeetCode题目38:外观数列
- GPUManager虚拟化方案
- [网络安全] 二.Web渗透信息收集之域名、端口、服务、指纹、旁站、CDN和敏感信息