Golang的接口
当一只鸟走路像鸭子,游泳像鸭子,叫起来也像鸭子,那么我们就认为它就是鸭子。
Duck typing 的理念因此比喻得名。
Golang 通过 interface 实现 duck typing。 Effective Go 文章中这样描述 interface: interface
指定了一种描述对象行为的方法:如果某样东西可以做这件事,这样东西就可以用在这里。
再具体讲, 就是当某个变量的类型实现了某个接口的所有方法 (这个时候可以称该类型实现
满足该接口) ,那么这个变量就能用在要求这个接口的地方。
package main import (
"reflect"
"fmt"
) type Test struct {
} func (this *Test)test() {
fmt.Println("in test()")
} type Tester interface {
test()
} func MakeTest1(v Tester) {
fmt.Printf("\nIn Maketest1\n")
v.(Tester).test()
} func MakeTest2(v interface{}) {
fmt.Printf("\nIn Maketest2\n")
v.(Tester).test()
} func main() {
t := new(Test)
var ti Tester
ti = t
ti.test() // 接口类型断言
// value为Test类型的对象
// 是ti的值
value := ti.(Tester)
fmt.Printf("\n方式1:\n")
fmt.Println(reflect.TypeOf(value))
value.test() // v是ti的值,是Test类型
// Tester是接口类型
if v, ok := ti.(Tester); ok {
fmt.Printf("\n方式2:\n")
fmt.Println(reflect.TypeOf(v))
v.test()
} // switch type专用组合
// 如果需要在if中判断可以用上面的形式
switch t := ti.(type) {
case Tester:
fmt.Printf("\n方式3:\n")
fmt.Println("Tester")
fmt.Println(reflect.TypeOf(t))
t.test()
default:
fmt.Println("Unknow")
} // 传递Test结构变量
// 因为Test实现了Tester接口
MakeTest1(t) // 传递Tester接口变量
MakeTest1(ti) // 传递Test结构变量
// 因为Test实现了interface{}接口
MakeTest2(t) // 传递Tester接口变量
// 因为任何类型都实现了interface{}
MakeTest2(ti) }
运行结果:
in test() 方式1:
*main.Test
in test() 方式2:
*main.Test
in test() 方式3:
Tester
*main.Test
in test() In Maketest1
in test() In Maketest1
in test() In Maketest2
in test() In Maketest2
in test()
Golang 里面有个空的接口 interface{}, 大括号里看上去什么也没有, 但认为它有一个空
的方法;Golang 里的每一种类型或者你自定义的类型,不管有没有添加了什么具体的方法,
都认为有一个空的方法。因此每种类型自动实现了 interface{}接口,要求 interface{}的地方
就可以用任意类型的变量。
Golang的接口的更多相关文章
- [golang note] 接口使用
侵入式接口 √ 在其他一些编程语言中,接口主要是作为不同组件之间的契约存在,即规定双方交互的规约. √ 对契约的实现是强制的,即必须确保用户的确实现了该接口,而实现一个接口,需要从该接口继承. √ 如 ...
- golang(08)接口介绍
原文链接 http://www.limerence2017.com/2019/09/12/golang13/#more 接口简介 golang 中接口是常用的数据结构,接口可以实现like的功能.什么 ...
- Golang之接口(interface)
Golang最重要的接口,,,, package main import ( "fmt" ) //interface类型默认是指针 /* 接口的实现 Golang中的接口,不需要显 ...
- golang中接口interface和struct结构类的分析
再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和 ...
- 七、golang中接口、反射
一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...
- Golang | 既是接口又是类型,interface是什么神仙用法?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第12篇文章,我们来继续聊聊interface的使用. 在上一篇文章当中我们介绍了面向对象的一些基本概念,以及gol ...
- 深入学习golang(5)—接口
接口 概述 如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构 ...
- [Go] golang的接口合约
接口类型1.接口类型具体描述了一系列方法的集合,实现这些方法的具体类型是这个接口类型的实例2.一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口 package main impor ...
- golang interface接口
package main import "fmt" type Shaper interface { Area() float32 } type Square struct { si ...
随机推荐
- [ Error 分析] Comparison method violates its general contract!
public static void main(String[] args) { List<Long> ret = new ArrayList<>(); int n = 103 ...
- Oracle Shared Pool 原理
Oracle Shared Pool 原理 由于shared pool中最重要的是library cache,所以本文主要讲解Library cache的结构,library cache latch, ...
- Hadoop2.0中单点故障解决方案总结---老董
Hadoop 1.0内核主要由两个分支组成:MapReduce和HDFS,众所周知,这两个系统的设计缺陷是单点故障,即MR的JobTracker和HDFS的NameNode两个核心服务均存在单点问题, ...
- xlrd、xlwt操作execl表格
在python中操作execl进行数据读写的时候,可以使用xlrd进行文件的读取,使用xlwt将数据写入execl中. 1.xlrd xlwt用来读取execl中的数据,常见的用法如下. (1)打开e ...
- BCB直接访问硬件端口和物理内存 - WinIO的应用
BCB直接访问硬件端口和物理内存 - WinIO的应用 (读硬盘参数和主板BIOS信息, 支持 Win9x/NT/2k/XP/2003) 关于直接访问端口, 有很多网站很多文章都讨论过, 但总找不到非 ...
- Java集合(6):TreeSet
一.TreeSet介绍 与HashSet是基于HashMap实现一样,TreeSet是基于TreeMap实现的.TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进 ...
- 第六课 GDB调试 (上)
1序言: 1.初学者经过学习前面的Makefile知识,信心满满,内心觉得应该要好好学习不单掌握语言的编写,也要学会相对应的工具调高开发效率.有时我们写出来的代码经过执行结果却跟我们预期不一样那怎么办 ...
- c3p0连接不上sql server
1.首先判断sqlserver是否安装成功 2如果sqlserver正常运行 可能是因为没有打开1433端口,按以下步骤设置tcp/ip enabled 打开之后再重新启动sql server服务,按 ...
- HTML5堆木头游戏
在线演示 本地下载
- Makefile的简单编写【学习笔记】
首先我们先创建两个简单的文件: main.c #include <stdio.h> extern void hi_fun(); int main() { printf("hell ...