Skip to main content

接口

接口

什么是接口,

简单来说接口就是规范,

抽象的,

关于接口的定义,

  • 命名通常以er为后缀
  • 接口体是接口或方法的集合,或者两者混合
  • 只有方法签名,没有方法实现

相比传统面向对象语言,go语言中的接口是非侵入式的.

函数类型,函数签名,函数声明

函数的类型称之为函数签名,是指函数参数与函数返回值类型

go
1
2
3

疑惑:函数类型和函数的类型是一回事吗?

空接口

上面说到接口是规范,是方法的集合,所谓空接口就是,是,所以空接口用来表示任意类型.

空接口的作用.

any是在Go1.18版本中随着泛型引入的一个预声明标识符.

go
1
2
3
//路径,/src/internal/types/testdata/check/funcInterface.go
type 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是什么?

阅读源码真的不容易?

接口赋值

接口查询

什么是接口查询

接口查询要在运行期才能确定.

接口查询有什么用?