Golang的接口是一种抽象的类型
Go语言中的接口(interface)是一组方法签名的集合,是一种抽象类型。接口定义了方法,但没有实现,而是由具体的类型(struct)实现这些方法,因此接口是一种实现多态的机制。
接口定义
1
2
3
4
|
type 接口名称er interface{
func(arg1 类型,arg2 类型2) 返回值
func(arg3 类型3) 返回值3
} //最好以er结尾表示 不加func也可以
|
结构体定义
1
2
3
|
type 结构体名称 struct{
Name 类型(string、int、bool等)
}
|
典型Demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package main
import (
"fmt"
)
// Worker 接口定义了一个方法 Work
type Worker interface {
Work()
}
// programmer 结构体代表一个程序员,定义数据类型
type programmer struct {
Java string
Linux string
Python string
}
// Work 实现了 Worker 接口的方法
func (p *programmer) Work() {
// 输出程序员的类型和使用的编程语言
fmt.Printf("小李正在学习%s\n", p.Java)
fmt.Printf("小张正在学习%s\n", p.Linux)
fmt.Printf("小王正在学习%s\n", p.Python)
}
func main() {
// 创建一个 programmer 实例,并初始化字段
myProgrammer := programmer{
Java: "Java语言",
Linux: "Linux运维",
Python: "Python语言",
}
var Myworker Worker = &myProgrammer // 接口变量赋值也叫实现结构体
Myworker.Work() //调用接口方法
}
|
一个类型实现多个接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package main
import (
"fmt"
"time"
)
// Worker 接口定义了一个方法 Work
type Worker interface {
Work()
}
type Stoper interface {
Stop()
}
// programmer 结构体代表一个程序员
type programmer struct {
Java string
Linux string
Python string
}
// Work 实现了 Worker 接口的方法
func (p *programmer) Work() { //指针接收者可以修改字段值
// 输出程序员的类型和使用的编程语言
fmt.Printf("小李正在学习%s\n", p.Java)
fmt.Printf("小张正在学习%s\n", p.Linux)
fmt.Printf("小王正在学习%s\n", p.Python)
}
func (p programmer) Stop() { //值接收者不修改字段值
fmt.Printf("小李已经停止学习%s\n", p.Java)
fmt.Printf("小张已经停止学习%s\n", p.Linux)
fmt.Printf("小王已经停止学习%s\n", p.Python)
}
func main() {
// 创建一个 programmer 实例,并初始化字段
myProgrammer := programmer{
Java: "Java语言",
Linux: "Linux运维",
Python: "Python语言",
}
x1 := programmer{} // 接口变量赋值也叫实现结构体
var Myworker Worker = &myProgrammer // 接口变量赋值也叫实现结构体
Myworker.Work() //调用接口方法
time.Sleep(time.Second * 2)
x1.Stop()
}
|
多个类型实现一个接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package main
import (
"fmt"
)
// Worker 接口定义了一个方法 Work
type Worker interface {
Work()
}
// programmer 结构体代表一个程序员
type programmer struct {
Python string
}
type older struct {
age int
}
func (p programmer) Work() {
fmt.Printf("%s的程序员正在工作", p.Python)
fmt.Println("") //换行
}
func (o older) Work() {
fmt.Printf("%d岁的程序员正在工作", o.age)
}
func main() {
// 创建一个 programmer 实例,并初始化字段
myProgrammer := programmer{
Python: "Python",
}
o := older{age: 20}
var Myworker Worker = &myProgrammer // 接口变量赋值也叫实现结构体
Myworker.Work() //调用接口方法
o.Work()
}
|
接口的嵌套
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package main
import (
"fmt"
)
// Worker 接口定义了一个方法 Work
type Worker interface {
Work()
}
type Moyuer interface {
Moyu()
}
type Peoler interface {
Worker
Moyuer
}
type Computer struct {
something string
}
func (c *Computer) Work() {
fmt.Printf("%s都要工作\n", c.something)
}
func (c *Computer) Moyu() {
fmt.Printf("%s也要摸鱼\n", c.something)
}
func main() {
sth := Computer{something: "程序员"}
x := &sth
x.Work()
x.Moyu()
}
|
空接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package main
import (
"fmt"
)
func main() {
var x interface{}
v1 := "程序猿"
v2 := 200
v3 := true
x = v1
fmt.Printf("%T类型 : %v\n", x, x)
x = v2
fmt.Printf("%T类型 : %v\n", x, x)
x = v3
fmt.Printf("%T类型 : %v\n", x, x)
}
|
信息
因为可以存储任意类型的变量,所以我们把他当做方法中的参数使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package main
import (
"fmt"
)
func test(w interface{}) {
fmt.Printf("Hello %s", w)
}
func main() {
words := "Golang"
test(words)
} //Hello Golang
|
类型断言
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package main
import (
"fmt"
)
func main() {
var words interface{} = "Golang"
switch value := words.(type) { //语法格式为:x.(T)
case string:
fmt.Printf("String类型,值为%v", value)
case int:
fmt.Printf("Int类型,值为%v", value)
case bool:
fmt.Printf("Bool类型,值为%v", value)
}
}
|