接口
接口
什么是接口,
简单来说接口就是规范,
抽象的,
关于接口的定义,
- 命名通常以er为后缀
- 接口体是接口或方法的集合,或者两者混合
- 只有方法签名,没有方法实现
相比传统面向对象语言,go语言中的接口是非侵入式的.
函数类型,函数签名,函数声明
函数的类型称之为函数签名,是指函数参数与函数返回值类型
go
1
2
3
疑惑:函数类型和函数的类型是一回事吗?
空接口
上面说到接口是规范,是方法的集合,所谓空接口就是,是,所以空接口用来表示任意类型.
空接口的作用.
any是在Go1.18版本中随着泛型引入的一个预声明标识符.
go
1
2
3
//路径,/src/internal/types/testdata/check/funcInterface.gotype any = interface{}
通过查看源码,可知any其实就是interface{}的类型别名而已.起到一个简化,语义化的作用.
这里提到了类型别名,回顾一下,类型别名其实就是语法糖,
在源码编译时,引擎会将其还原成原类型,
接口声明
方法签名,
注意方法签名和方法类型的区别
名字通常以er结尾
只有方法声明,没有方法实现,
接口的初始化
fmt.Printf和fmt.Sprintf引入接口的概念:
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func Printf(format string, a ...any) (n int, err error) {return Fprintf(os.Stdout, format, a...)}func Fprintf(w io.Writer, format string, a ...any) (n int, err error) {p := newPrinter()p.doPrintf(format, a)n, err = w.Write(p.buf)p.free()return}func Sprintf(format string, a ...any) string {p := newPrinter()p.doPrintf(format, a)s := string(p.buf)p.free()return s}
通过分析fmt.Printf和fmt.Sprintf,两者底层都用到了p.doPrintf(format, a),
newPrinter()是什么?
sync包是
sync.pool是什么?
阅读源码真的不容易?
接口赋值
接口查询
什么是接口查询
接口查询要在运行期才能确定.
接口查询有什么用?