ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【笔记】go语言--接口

2022-02-09 19:32:59  阅读:208  来源: 互联网

标签:类型 -- typing 接口 interface duck go Retriever


【笔记】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的内容写到底层的数据流里面,返回内容的长度

标签:类型,--,typing,接口,interface,duck,go,Retriever
来源: https://www.cnblogs.com/jokingremarks/p/15876390.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有