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 ...
随机推荐
- 关于 sql server 基本使用的建议
1. 把现有的表插入到新表,(表不能存在),为表备份. -- select * into NewTable from OldTable (NewTable 在select 查询的 ...
- day9 文件的读取
文件操作 一.打开文件 f = open('歌词.txt','w',encoding='utf-8') # f:文件操作符 文件句柄 文件操作对象 open打开文件是依赖了操作系统提供的途径 操作系统 ...
- 08 Spring框架 AOP (一)
首先我们先来介绍一下AOP: AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充.面向对象编程是从静态角度考虑程序的结构,面向切面编程是从动态的 ...
- 对Java的接口和抽象类 的一些了解
学习并转载自: https://mp.weixin.qq.com/s?__biz=MzAxMzQ3NzQ3Nw==&mid=2654251476&idx=4&sn=e66ec4 ...
- 【c++习题】【17/4/16】动态分配内存
#include<iostream> #include<cstring> #define N 100 using namespace std; class String{ pu ...
- MySQL-5.7 高阶语法及流程控制
1.标签语句 [begin_label:] BEGIN [statement_list] END [end_label] [begin_label:] LOOP statement_list END ...
- [mongodb] WiredTiger Storage Engine
今天看了mongodb的官方文档中的WiredTiger Storage Engine ,说说我对WiredTiger Storage Engine 的理解! 在mongodb3.2版本以后,wire ...
- Servlet容器初始化IOC容器
<!-- ServletContext参数,配置Ioc容器的xml文件名 --> <context-param> <param-name>contextConfig ...
- Pandas分组(GroupBy)
任何分组(groupby)操作都涉及原始对象的以下操作之一.它们是 - 分割对象 应用一个函数 结合的结果 在许多情况下,我们将数据分成多个集合,并在每个子集上应用一些函数.在应用函数中,可以执行以下 ...
- JNIjw03
1.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_JNIjw03.h" JNIEXPORT void JNICALL ...