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这种机制呢?我个人 ...
随机推荐
- Unity扩展让枚举视图中变成多选框
如图: 定义属性描述特性(因为没有描述的数据,让绘制类去绘制所以为空) using UnityEngine; using System.Collections; public class EnumFl ...
- java中a++与++a区别
java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...
- Swift观察者模式
用swift写一个观察者模式,集合了swift语言中类,数组,协议,方法,字符串,条件控制语句等一些语法.简单介绍下观察者模式,在观察者模式中,会改变的是主题的状态以及观察者的数目.用这个模式,可以改 ...
- stagefright框架(四)-Video Buffer传输流程
這篇文章將介紹Stagefright中是如何和OMX video decoder传送buffer. (1) OMXCodec會在一開始的時候透過read函式來傳送未解碼的data給decoder,並且 ...
- JS局部打印两种方法
所有浏览器都可以 <html> <head title=""> <title>测试打印</title> <style medi ...
- django学习笔记一
django作为一个python的开源项目发布,其web框架采用了mtv设计模式 在目前一些较为成熟的大型网站中有不少网站的应用基于django开发,django作为一个重量型的web框架提供了以下的 ...
- React-Native 获取node.js提供的接口
一个简单的React-Native 获取node.js提供的接口的实现 一.node.js var http = require("http"); var url = requir ...
- 从汇编看c++中指向成员变量的指针(一)
在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当 ...
- sqlplus 链接数据库
实验目的:在虚拟机中用sqlplus工具访问真实机的数据库: 实验环境: 真实机(windows系统,数据库服务名 orcl): SQL> select * from v$version; BA ...
- python操作csv-xls完善后的代码
#coding:utf-8 #导入相应模块 import csv,xlwt,sys,os,fnmatch,xlrd from xlutils.copy import copy #对xls文件中的绝对值 ...