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

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. C#前后端交互

    后台接收 方式1: Request.Form[""] post Request.QueryString[""] get System.Web.HttpConte ...

  2. python中的pass语句是什么

    当用python写代码时,有时可能还没想好函数怎么写,只写了函数声明,但为了保证语法正确,必须输入一些东西,这种情况下,我们会使用pass语句 def func(*args): pass break语 ...

  3. Keras实践:实现非线性回归

    Keras实践:实现非线性回归 代码 import os os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" import ke ...

  4. 微信小程序之日期与时间插件

    页面 <picker mode="time" value="{{time}}" start="{{minTime}}" end=&qu ...

  5. 操作JavaScript数组

    unshift:在数据首段添加元素. push: 在数组的末端添加元素. shift:移除并返回第一个元素,会影响 数组长度. pop:移除并返回最后一个元素.会影响 数组长度. delete  数组 ...

  6. 分组函数NTILE函数

    这个分组函数 并不是 group by的分组.

  7. Spring 之 @ComponentScan以及mock Spring MVC

    [ @ComponentScan] 纠正:可以成功 Autowired 的原因是我在另外一个 config 文件中扫描了根包,这会顺带扫描所有该包的子包 还有,,上面的写法容易出错,建议这样写, @C ...

  8. 通过自动回复机器人学Mybatis:搭建核心架构

    imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 MessageDao.java package com.imooc.dao; impor ...

  9. Android Studio 入门级教程

    引用原文:http://www.cnblogs.com/abao0/p/6934023.html 写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权.希望尽自己的努力 ...

  10. kafka入门使用

    kafka版本0.11.0.1以上自带zookeeper,必须要求环境中有jdk,解压后进入目录 1.在kafka解压目录下下有一个config的文件夹,里面放置的是我们的配置文件 consumer. ...