一、概述

  接口类型是对 ”其他类型行为“ 的抽象和概况;因为接口类型不会和特定的实现细节绑定在一起;很多面向对象都有类似接口概念,但Golang语言中interface的独特之处在于它是满足隐形实现的。也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单拥有一些必需的就ok了;

  此时,我们对于interface还是比较迷茫,关键在于interface与其他具体类型(除interface之后都是具体类型)的不同之处在于,interface是抽象的;比如我们看到int类型,就知道int类型具有的算术操作;切片类型的索引操作等等;具体的类型还可以通过它的方法提供额外的行为操作;总之,当拿到一个具体的类型时,就知道它本身是什么和可以用它来做什么;

  interface类型:抽象的类型,它不会暴露出它所代表的对象的内部值的结构和这个对象支持的基础操作的集合(而且它自己也没有,所以接口本身也没法展示),它只会展示出它自己的方法;

    也就是说,当看到一个interface时,我们并不知道它是什么,唯一知道的就是可以通过它的方法来做什么;(这会又迷糊了...zZZ)

 func Printf(format string, a ...interface{}) (n int, err error){
return Fprintf(os.Stdout, format, a...)
} func Sprintf(format string, args ...interface{}) string{
var buf bytes.Buffer
Fprintf(&buf, format, args...)
return buf.String()
} func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error){
...
}

  关键点在于:第2行,第7行中调用Fprintf()函数时,传递的第一个参数;

  第2行实参: os.Stdout 是*os.File类型

  第7行实参: buf 是bytes.Buffer类型

  而实现函数的形参是io.Writer类型,是interface类型

 package io
// Writer is the interface that wraps the basic Write method.
type Writer interface {
// Write writes len(p) bytes from p to the underlying data stream.
// It returns the number of bytes written from p (0 <= n <= len(p))
// and any error encountered that caused the write to stop early.
// Write must return a non-nil error if it returns n < len(p).
// Write must not modify the slice data, even temporarily.
//
// Implementations must not retain p.
Write(p []byte) (n int, err error)
}

  此时就将interface的意义展示的淋漓尽致了;

  interface(io.Write) 定义了函数Fprintf和该函数的调用者之间的约定:

  • 对调用者的约束:实参必须有一个特定的签名和提供一个Write函数
  • 对函数的约束:   Fprintf接受任何满足io.Writer接口的参数都可以正常工作

  一个类型(形参)可以自由的使用另一个满足相同接口的类型(实参)来进行替换被称为可替代性(LSP里氏替换) —— c++的多态

 package main

 import "fmt"

 type Msg struct {
Id int
Name string
} func (this *Msg) Write(p []byte) (int, error) {
this.Id += int(len(p))
this.Name = "interface"
return this.Id, nil
} func main() {
msg := new(Msg)
msg.Id =
msg.Name = "interface test print" var name = "Dolly"
fmt.Fprintf(msg, "%s", name) //convert msg, call Write(my func)
fmt.Println(msg) //stdout
}

 调用fmt.Fprintf函数,第一个参数传入自定义的参数,该参数必须实现Write函数,否则编译报错; 

二、接口类型

  接口类型具体描述了一系列方法的集合,一个实现了这些方法的具体类型称为该接口的实例;

golang之interface的更多相关文章

  1. Golang的Interface是个什么鬼

    问题概述 Golang的interface,和别的语言是不同的.它不需要显式的implements,只要某个struct实现了interface里的所有函数,编译器会自动认为它实现了这个interfa ...

  2. golang 关于 interface 的学习整理

    Golang-interface(四 反射) go语言学习-reflect反射理解和简单使用 为什么在Go语言中要慎用interface{} golang将interface{}转换为struct g ...

  3. golang的interface剖析

      背景: golang的interface是一种satisfied式的.A类只要实现了IA interface定义的方法,A就satisfied了接口IA.更抽象一层,如果某些设计上需要一些更抽象的 ...

  4. Golang 的 `[]interface{}` 类型

    Golang 的 []interface{} 类型 我其实不太喜欢使用 Go 语言的 interface{} 类型,一般情况下我宁愿多写几个函数:XxxInt, XxxFloat, XxxString ...

  5. Golang接口(interface)三个特性(译文)

    The Laws of Reflection 原文地址 第一次翻译文章,请各路人士多多指教! 类型和接口 因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍. go是一个静态性语言,每个变量都 ...

  6. Golang-interface(四 反射)

    github:https://github.com/ZhangzheBJUT/blog/blob/master/reflect.md 一 反射的规则 反射是程序执行时检查其所拥有的结构.尤其是类型的一 ...

  7. golang将interface{}转换为struct

    项目中需要用到golang的队列,container/list,需要放入的元素是struct,但是因为golang中list的设计,从list中取出时的类型为interface{},所以需要想办法把i ...

  8. Golang-interface(二 接口与nil)

    github: https://github.com/ZhangzheBJUT/blog/blob/master/nil.md 一 接口与nil 前面解说了go语言中接口的基本用法,以下将说一说nil ...

  9. golang(10)interface应用和复习

    原文链接 http://www.limerence2017.com/2019/10/11/golang15/ interface 意义? golang 为什么要创造interface这种机制呢?我个人 ...

随机推荐

  1. Unity 预处理命令

    我们经常在代码里面写Debug.Log()调试代码,游戏后门代码.这些代码在发布时无意义的,我们就需要慢慢的删除掉它们(很痛苦),有什么办法让它们在编译的时候并不加入编译代码中呢?  预处理命令..比 ...

  2. C# 基础概念之延迟加载

    本文来自:http://kb.cnblogs.com/page/99182/ 作者: 杨延成  来源: 博客园  发布时间: 2011-05-01 15:06  阅读: 4662 次  推荐: 0   ...

  3. 提高你的Java代码质量吧:小心switch带来的空值异常

    一.分析  使用枚举定义常量时,会有伴有大量的switch语句判断,目的是为每个枚举解释其行为. 我们知道,目前的Java的switch语句只能判断byte.short.char.int类型(JDK7 ...

  4. Android应用程序组件Content Provider简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6946067 在Android系统中,Conte ...

  5. SQL Server 两种判断表名是否存在且删除的方式

      邓老师(老邓)教的 if exists(select * from sysobjects where name='Table_88') drop table Table_88  偷的((*^__^ ...

  6. Android studio教程:[1] 创建app项目

    Android studio作为面市不久的安卓开发工具,越来越受到大家的喜爱,这里我将介绍如何在Android studio中创建一个APP项目,并在以后经验中介绍其他有关Android studio ...

  7. JQ图片跟着鼠标走

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 深入char、varchar、text和nchar、nvarchar、ntext的区别详解

    很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大 ...

  9. hdu2304Electrical Outlets

    Problem Description Roy has just moved into a new apartment. Well, actually the apartment itself is ...

  10. php.ini配置

    PHP作为一门强大的脚本语言被越来越多的web应用程序采用,不规范的php安全配置可能会带来敏感信息泄漏.SQL注射.远程包含等问题,规范的安全配置可保障最基本的安全环境.下面我们分析几个会引发安全问 ...