1.0.0
Part I
Golang 基础之接口

接口

  • 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口
  • 接口类型 是由一组方法签名定义的集合。接口类型的变量可以保存任何实现了这些方法的值。
  • 隐式接口从接口的实现中解耦了定义,这样接口的实现可以出现在任何包中,无需提前准备。
  • 接口值可以用作函数的参数或返回值。
  • nil 接口值既不保存值也不保存具体类型。
  • 空接口可保存任何类型的值,空接口被用来处理未知类型的值。

类型断言

  • 类型断言,提供了访问接口值底层具体值的方式
    • t := i.(T) 该语句断言接口值 i 保存了具体类型 T,并将其底层类型为 T 的值赋予变量 t。
1
var i interface{} = "hello"
2
3
s := i.(string)
4
fmt.Println(s)
5
6
s, ok := i.(string)
7
fmt.Println(s, ok)
8
9
f, ok := i.(float64)
10
fmt.Println(f, ok)
11
12
f = i.(float64) // 报错(panic)
13
fmt.Println(f)
Copied!

类型选择

  • 是一种按顺序从几个类型断言中选择分支的结构。
  • 类型选择与一般的 switch 语句相似,不过类型选择中的 case 为类型(而非值), 它们针对给定接口值所存储的值的类型进行比较。
  • 按照接口接受的类型,然后case判断当前类型,在返回对应情况
1
func do(i interface{}) {
2
switch v := i.(type) {
3
case int:
4
fmt.Printf("Twice %v is %v\n", v, v*2)
5
case string:
6
fmt.Printf("%q is %v bytes long\n", v, len(v))
7
default:
8
fmt.Printf("I don't know about type %T!\n", v)
9
}
10
}
11
12
func main() {
13
do(21)
14
do("hello")
15
do(true)
16
}
Copied!

定义一个最常用的接口 Stringer

  • Stringer 是一个可以用字符串描述自己的类型。fmt 包(还有很多包)都通过此接口来打印值。
1
type Person struct {
2
Name string
3
Age int
4
}
5
6
func (p Person) String() string {
7
return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
8
}
9
10
func main() {
11
a := Person{"kk", 23}
12
z := Person{"chuhe miao", 22}
13
fmt.Println(a, z)
14
}
Copied!

接口示例

1
// 定义接口Phone,里面仅有call()一个方法
2
type Phone interface {
3
call()
4
}
5
6
type HwPhone struct {
7
}
8
9
func (hwPhone HwPhone) call() {
10
fmt.Println("I am HwPhone, I can call you!")
11
}
12
13
type IPhone struct {
14
}
15
16
func (iPhone IPhone) call() {
17
fmt.Println("I am iPhone, I can call you!")
18
}
19
20
21
func main() {
22
// 定义一个phone的变量
23
var phone Phone
24
25
phone = new(HwPhone)
26
phone.call()
27
28
phone = new(IPhone)
29
phone.call()
30
31
}
Copied!

本教程系列代码

Last modified 1yr ago