【笔记】go语言--接口

接口的概念

  • 强类型语言:熟悉接口的概念
  • 弱类型语言:没(少)有接口的概念
  • 接口的详解︰使用Google Guice实现依赖注入
curl 是获取http请求的命令工具
curl一个地址可以将首页的源码(html文件)给拉下来
例如:http.get("http://www.imooc.com")
//接口的本质
type Traversal interface {
Traverse()
} func main() {
traversal := getTraversal()
traversal.Traverse()
}

duck typing的概念

duck typing

  • “像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子”
  • 描述事物的外部行为而非内部结构
  • 严格说go属于结构化类型系统,类似duck typing

go语言的duck typing

  • 同时需要Readable,Appendable怎么办?( apache polygene)
  • 同时具有python , c++的duck typing的灵活性
  • 又具有java的类型检查
//java中的类似代码,传入的参数必须实现Retriever接口,不是duck typing
<R extends Retriever>
String download(R r) {
return r.get("www.imooc.com");
} //C++中的duck typing,编译时才知道传入的retriever有没有get,需要注释来说明接口
template <class R>
string download(const R& retriever) {
return retriever.get("www.imooc.com");
} //python中的duck typing,运行时才知道传入的retriever有没有get,需要注释来说明接口
def download(retriever):
return retriever.get("www.imooc.com")

接口的定义和实现

  • 在go当中接口由使用者定义,通常由使用方写在使用方的代码里
  • 接口的实现是隐式的,不需要声明实现了哪个接口,只需要实现接口里的方法就可以了

简单来说,接口由使用者定义且接口的实现是隐式的,实现接口里面的方法即可

注意的是:

  • interface 里不用加func关键字,因为里面都是函数
  • 实现接口的快捷键 crtl+shift+i

接口的值类型

1、接口内部包含俩个东西,分别是类型T和值V,值可以是真是的值,也可以是个指针。
2、接口变量自带指针
3、接口变量同样采用值传递,几乎不需要使用接口指针
4、指针接收者实现只能以指针方式使用;值接收者就都可以
5、var r Retriver (Retriver是接口)
r = mock.Retriever{}(值接收)
r = &mock.Retriever{}
r = &real.Retriever{}(接收者为指针)
6、type assertion

查看接口变量

  • 表示任何类型:interfacel
  • Type Assertion
  • Type Switch

interface的实现类型的检查方式

(1) 类型转换
//参数r的类型是interface,通过.(type)转换成他的实现类型的变量v,
//然后根据v的实际类型,打印出v的值
func inspect(r Retriever) {
fmt.Printf("%T %v\n", r, r)
switch v := r.(type) {
case mock.Retriever:
fmt.Println("Contents: ", v.Contents)
case real.Retriever:
fmt.Println(v)
}
} (2) 类型断言 也是 类型转换
- v = x.(T)
- v, ok = x.(T)
x是接口变量,T是指定转换的类型
ok表示转换是否成功,v是对应类型的值
var r Retriever
r = real.Retriever{}
fmt.Printf("%T %v\n", r, r)
mr := r.(mock.Retriever)
fmt.Println(mr.Contents)
(panic: interface conversion: main.Retriever is real.Retriever, not mock.Retriever)

常用的系统接口:

  • stringer 类似于其他语言的toString
  • Reader
  • Writer
//详细
1.fmt.Stringer interface
- String() string 2.io.Reader interface
- Read(p []byte) (n int, err error)
把字节读入参数p,长度不能超多byte数组的长度,返回实际长度n
Ex) string.NewReader(string) *Reader 3.io.Writer interface
- Write(p []byte) (n int, err error)
把字节数组p的内容写到底层的数据流里面,返回内容的长度

【笔记】go语言--接口的更多相关文章

  1. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  2. Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法

    由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...

  3. C语言接口与实现实例

    一个模块有两部分组成:接口和实现.接口指明模块要做什么,它声明了使用该模块的代码可用的标识符.类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实 ...

  4. [转]SQLITE3 C语言接口 API 函数简介

    SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sq ...

  5. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  6. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  7. 基于Oracle OCI的数据访问C语言接口ORADBI .

    基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008   ORADBI是我在Oracle OCI(Oracle 调用接口)基础 ...

  8. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  9. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  10. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. vscode 点击 import 的对象 from 带有 @ 不能自动跳转 - 要配置 jsconfig.json

    问题 vscode 点击 import 的对象 from 带有 @ 不能自动跳转 - 要配置 jsconfig.json 答案 根目录 创建 jsconfig.json 20220808 更新 inc ...

  2. Java使用Steam流对数组进行排序

    原文地址:Java使用Steam流对数组进行排序 - Stars-One的杂货小窝 简单记下笔记,不是啥难的东西 sorted()方法里传了一个比较器的接口 File file = new File( ...

  3. 多线程系列(二十) -CompletableFuture使用详解

    一.摘要 在上篇文章中,我们介绍了Future相关的用法,使用它可以获取异步任务执行的返回值. 我们再次回顾一下Future相关的用法. public class FutureTest { publi ...

  4. Linux 运维工程师面试真题-2-Linux 命令及文件操作

    Linux 运维工程师面试真题-2-Linux 命令及文件操作 1.在/tmp/目录下创建 test.txt 文件,内容为: Hello,World! ,用一个命令写出来. 2.给 test.txt ...

  5. #树形dp#洛谷 1272 重建道路

    题目 给出一个大小为 \(n\) 的树, 问至少断掉多少条边使得存在一个大小为 \(m\) 的连通块 \(n\leq 150\) 分析 设 \(dp[x][s]\) 表示以 \(x\) 为根的子树至少 ...

  6. 深入探讨Java面试中内存泄漏:如何识别、预防和解决

    引言 在编写和维护Java应用程序时,内存泄漏是一个重要的问题,可能导致性能下降和不稳定性.本文将介绍内存泄漏的概念,为什么它在Java应用程序中如此重要,并明确本文的目标,即识别.预防和解决内存泄漏 ...

  7. JDK10的新特性:本地变量类型var

    目录 简介 为什么我们需要var var使用在什么地方 var不能用在什么地方 其他var的特点 总结 简介 java以面向对象的特性显著于世并得到了蓬勃的发展.在语言的发展过程中,为了让java语言 ...

  8. WPF/MVVM模式入门教程(一):简介与规范

    引用:https://www.cnblogs.com/flh1/p/12421652.html 什么是MVVM模式? MVVM的全称是--Model.View.ViewModel,翻译过来就是:模型. ...

  9. openstack-train-ovs-ceph 部署

    第一章 Openstack简介 https://baike.baidu.com/item/OpenStack/342467?fr=aladdin Openstack框架图![img](file:/// ...

  10. 财务人提高竞争力必备的技能,怎么能少了ta!

    从近年来大数据技术的发展趋势和相关产业飞速发展的状态,可以看出当前"数据分析"的热度可以说是有增无减,而且从市场上对数据分析人才的需求缺口也可以看出企业对数据分析的重视程度.未来随 ...