接口
Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。
如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出。(对比java中的重写toString()方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 type student struct { name string age int } func (s student) String() string { str := fmt.Sprintf("name:[%s],age:[%d]\n", s.name, s.age) return str } func main() { var s student = student{ name: "张三", age: 18, } fmt.Println(s) }
接口实现
Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,golang中没有implement类似的关键字 如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口。 如果一个变量只含有了1个interface的方部分方法,那么这个变量没有实现这个接口。
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 type Person interface { eat() sleep() run() } // Student实现了Person接口中的所有方法即Student实现了Person接口 type Student struct { Name string Age int } func (s Student) eat() { fmt.Printf("%s eat!\n", s.Name) } func (s Student) sleep() { fmt.Printf("%s sleep!\n", s.Name) } func (s Student) run() { fmt.Printf("%s run!\n", s.Name) } func main() { var s Student = Student{ Name: "张三", Age: 18, } s.eat() s.sleep() s.run() } ----------------------- 张三 eat! 张三 sleep! 张三 run!
接口嵌套 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 50 51 52 53 type Person interface { eat() sleep() run() } type Students interface { Person learn() exam() } type Student struct { Name string Age int } func (s Student) eat() { fmt.Printf("%s 吃饭!\n", s.Name) } func (s Student) sleep() { fmt.Printf("%s 睡觉!\n", s.Name) } func (s Student) run() { fmt.Printf("%s 运动!\n", s.Name) } func (s Student) learn() { fmt.Printf("%s 学习!\n", s.Name) } func (s Student) exam() { fmt.Printf("%s 考试!\n", s.Name) } func main() { var s Student = Student{ Name: "张三", Age: 18, } s.eat() s.sleep() s.run() s.learn() s.exam() } ---------------- 张三 吃饭! 张三 睡觉! 张三 运动! 张三 学习! 张三 考试!
多态
一种事物的多种形态,都可以按照统一的接口进行操作
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 type Persons interface { eat() sleep() run() } type Students interface { Persons learn() exam() } type Person struct { Name string Age int } type Student struct { Name string Age int } func (s Student) eat() { fmt.Printf("%s 吃饭!\n", s.Name) } func (s Student) sleep() { fmt.Printf("%s 睡觉!\n", s.Name) } func (s Student) run() { fmt.Printf("%s 运动!\n", s.Name) } func (s Student) learn() { fmt.Printf("%s 学习!\n", s.Name) } func (s Student) exam() { fmt.Printf("%s 考试!\n", s.Name) } func (p Person) eat() { fmt.Printf("%s 吃饭!\n", p.Name) } func (p Person) sleep() { fmt.Printf("%s 睡觉!\n", p.Name) } func (p Person) run() { fmt.Printf("%s 运动!\n", p.Name) } func main() { var ps Persons var s Student = Student{ Name: "张三", Age: 18, } var p Person = Person{ Name: "李四", Age: 18, } // 这里接口Persons可以是Person 也可以是Student ps = s ps.eat() ps.run() ps.sleep() ps = p ps.eat() ps.run() ps.sleep() } -------------------- 张三 吃饭! 张三 运动! 张三 睡觉! 李四 吃饭! 李四 运动! 李四 睡觉!