当一只鸟走路像鸭子,游泳像鸭子,叫起来也像鸭子,那么我们就认为它就是鸭子。

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{}的地方

就可以用任意类型的变量。

下载interface.go

Golang的接口的更多相关文章

  1. [golang note] 接口使用

    侵入式接口 √ 在其他一些编程语言中,接口主要是作为不同组件之间的契约存在,即规定双方交互的规约. √ 对契约的实现是强制的,即必须确保用户的确实现了该接口,而实现一个接口,需要从该接口继承. √ 如 ...

  2. golang(08)接口介绍

    原文链接 http://www.limerence2017.com/2019/09/12/golang13/#more 接口简介 golang 中接口是常用的数据结构,接口可以实现like的功能.什么 ...

  3. Golang之接口(interface)

    Golang最重要的接口,,,, package main import ( "fmt" ) //interface类型默认是指针 /* 接口的实现 Golang中的接口,不需要显 ...

  4. golang中接口interface和struct结构类的分析

    再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和 ...

  5. 七、golang中接口、反射

    一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...

  6. Golang | 既是接口又是类型,interface是什么神仙用法?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第12篇文章,我们来继续聊聊interface的使用. 在上一篇文章当中我们介绍了面向对象的一些基本概念,以及gol ...

  7. 深入学习golang(5)—接口

    接口 概述 如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构 ...

  8. [Go] golang的接口合约

    接口类型1.接口类型具体描述了一系列方法的集合,实现这些方法的具体类型是这个接口类型的实例2.一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口 package main impor ...

  9. golang interface接口

    package main import "fmt" type Shaper interface { Area() float32 } type Square struct { si ...

随机推荐

  1. python 对象和类

    python中所有数据都是以对象形式存在.对象既包含数据(变量),也包含代码(函数),是某一类具体事物的特殊实例. 面向对象的三大特性为封装.继承和多态. 1.定义类 #定义空类 class Pers ...

  2. 微信小程序组件swiper

    视图容器swiper:官方文档 Demo Code Page({ data:{ imgUrls: [ 'http://img02.tooopen.com/images/20150928/tooopen ...

  3. HDU 4292 Food (拆点最大流)

    题意:N个人,F种食物,D种饮料,给定每种食物和饮料的量.每个人有自己喜欢的食物和饮料,如果得到自己喜欢的食物和饮料才能得到满足.求最大满足的人数. 分析:如果只是简单地N个人选择F种食物的话可以用二 ...

  4. 执行用例,并生成报告——discover,HTMLRunner

    HTMLRunner需要下载Python3的格式,懒人链接:http://pan.baidu.com/s/1tp3Ts 参考:http://bbs.chinaunix.net/thread-41547 ...

  5. redis 笔记03 RDB 持久化、AOF持久化、事件、客户端

    RDB 持久化 1. RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据. 2. SAVE命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器. 3. BGSAVE由子进程执行保 ...

  6. Firebug入门指南(转)

    本文转自:http://www.ruanyifeng.com/blog/2008/06/firebug_tutorial.html 作者: 阮一峰 日期: 2008年6月 8日 据说,对于网页开发人员 ...

  7. koa2.0富文本编辑器的选择历程

    本人学习vue和koa2.0,做了一个简单的个人博客,博客自然会需要富文本编辑器的选择,由于nodejs和koa2.0,于是便开始了不断尝试的历程. 一.ueditor 刚开始在百度搜索,自然第一个发 ...

  8. Django-JS实现的ajax

    JS实现的ajax ajax的优缺点 AJAX使用Javascript技术向服务器发送异步请求 AJAX无须刷新整个页面 因为服务器响应内容不再是整个页面,而是页面中的局部,所以AJAX性能高 小练习 ...

  9. 自定义QSS

    /*QComboBox*/ QComboBox {border: 1px solid rgb(111, 156, 207);border-radius: 3px;padding: 1px 18px 1 ...

  10. Kotlin 取 MAC 地址

    package com.example.ybs.myapplication import android.annotation.SuppressLint import android.net.wifi ...