golang之interface
一、概述
接口类型是对 ”其他类型行为“ 的抽象和概况;因为接口类型不会和特定的实现细节绑定在一起;很多面向对象都有类似接口概念,但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的更多相关文章
- Golang的Interface是个什么鬼
		
问题概述 Golang的interface,和别的语言是不同的.它不需要显式的implements,只要某个struct实现了interface里的所有函数,编译器会自动认为它实现了这个interfa ...
 - golang 关于 interface 的学习整理
		
Golang-interface(四 反射) go语言学习-reflect反射理解和简单使用 为什么在Go语言中要慎用interface{} golang将interface{}转换为struct g ...
 - golang的interface剖析
		
背景: golang的interface是一种satisfied式的.A类只要实现了IA interface定义的方法,A就satisfied了接口IA.更抽象一层,如果某些设计上需要一些更抽象的 ...
 - Golang 的 `[]interface{}` 类型
		
Golang 的 []interface{} 类型 我其实不太喜欢使用 Go 语言的 interface{} 类型,一般情况下我宁愿多写几个函数:XxxInt, XxxFloat, XxxString ...
 - Golang接口(interface)三个特性(译文)
		
The Laws of Reflection 原文地址 第一次翻译文章,请各路人士多多指教! 类型和接口 因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍. go是一个静态性语言,每个变量都 ...
 - Golang-interface(四 反射)
		
github:https://github.com/ZhangzheBJUT/blog/blob/master/reflect.md 一 反射的规则 反射是程序执行时检查其所拥有的结构.尤其是类型的一 ...
 - golang将interface{}转换为struct
		
项目中需要用到golang的队列,container/list,需要放入的元素是struct,但是因为golang中list的设计,从list中取出时的类型为interface{},所以需要想办法把i ...
 - Golang-interface(二 接口与nil)
		
github: https://github.com/ZhangzheBJUT/blog/blob/master/nil.md 一 接口与nil 前面解说了go语言中接口的基本用法,以下将说一说nil ...
 - golang(10)interface应用和复习
		
原文链接 http://www.limerence2017.com/2019/10/11/golang15/ interface 意义? golang 为什么要创造interface这种机制呢?我个人 ...
 
随机推荐
- Kolor Neutralhazer v1.0.2 (照片雾气模糊去除过滤器)+破解RI
			
由于空气污染.阴霾几天越来越,根据照片始终是一个灰色,怎么做?有了这个插件.能够解除您的烦恼. Neutralhazer这是消除你的风景照片和雾气模糊的全景图的有效途径photoshop小工具. wa ...
 - Unity 屏幕震动效果实现
			
要实现震屏效果其实并不难,所谓的震屏在PC端可以简单地理解为相机(MainCamera)的抖动. 代码实现如下: using UnityEngine; using System.Collections ...
 - CentOS 7.0 systemd代替service
			
CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Linux标准 ...
 - android——背景颜色渐变(梯度变化)
			
首先在drawable文件夹下面新建一个xml文件,起名为bgcolor.xml. 代码如下: <?xml version="1.0" encoding="utf- ...
 - AppSettings
			
1.winform中读写配置文件appSettings 一节中的配置. #region 读写配置文件 /// <summary> /// 修改配置文件中某项的值 /// </summ ...
 - Android开发_关于如何屏蔽Home键
			
今天在遇到一个要屏蔽Home键的问题,研究一上午终于解决,方法记录于下: 在Android2.3版本以下重写以下方法就能屏蔽Home键: public void onAttachedToWindow( ...
 - Asp.net MVC razor语法参考
			
Razor语法的快捷参考http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx/ 只是copy下来便于查阅! I ...
 - AspectJ截获操作
			
package com.example.aspectjandroidtest; import java.io.BufferedOutputStream; import java.io.ByteArra ...
 - 详解如何在linuxmint上用源码包安装nodejs
			
第一步:安装依赖包 因为Linuxmint 和 Ubuntu 同属 Debian系的Linux,而且Linuxmint是建立在Ubuntu的基础上的,所以Ubuntu下的命令和包,Linuxmin ...
 - Change the ball--hdu2277
			
Change the ball Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...