GO学习笔记09

接口

1.接口定义

    package main
    
    import "fmt"
    
    //定义接口类型
    type Humaner interface {
    	sayHi()
    }
    
    type Student struct {
    	name string
    	id   int
    }
    
    func (stu *Student) sayHi() {
    	fmt.Printf("Student[%s,%d] sayHi\n", stu.name, stu.id)
    }
    
    type Teacher struct {
    	addr  string
    	group string
    }
    
    func (teacher *Teacher) sayHi() {
    	fmt.Printf("Teacher[%s,%s] sayHi\n", teacher.addr, teacher.group)
    }
    
    type Mystr string
    
    func (str *Mystr) sayHi() {
    	fmt.Printf("Mystr[%s] sayHi\n", *str)
    }
    
    func main() {
    	var human Humaner
    	s := &Student{"tony", 77}
    	human = s
    	human.sayHi()
    
    	t := &Teacher{"tom", "go"}
    	human = t
    	human.sayHi()
    
    	var str Mystr = "Hello Tony"
    	human = &str
    	human.sayHi()
    }
    
    
    Student[tony,77] sayHi
    Teacher[tom,go] sayHi
    Mystr[Hello Tony] sayHi

2.多态

    package main
    
    import "fmt"
    
    //定义接口类型
    type Humaner interface {
    	sayHi()
    }
    
    type Student struct {
    	name string
    	id   int
    }
    
    func (stu *Student) sayHi() {
    	fmt.Printf("Student[%s,%d] sayHi\n", stu.name, stu.id)
    }
    
    type Teacher struct {
    	addr  string
    	group string
    }
    
    func (teacher *Teacher) sayHi() {
    	fmt.Printf("Teacher[%s,%s] sayHi\n", teacher.addr, teacher.group)
    }
    
    type Mystr string
    
    func (str *Mystr) sayHi() {
    	fmt.Printf("Mystr[%s] sayHi\n", *str)
    }
    
    //定义一个普通函数,函数的参数为接口类型
    //只有一个函数,可以有不同的表现,多态
    func WhoSayHi(humaner Humaner) {
    	humaner.sayHi()
    }
    
    func main() {
    	s := &Student{"tony", 77}
    	t := &Teacher{"tom", "go"}
    	var str Mystr = "Hello Tony"
    
    	//调用同一个函数,不同的表现
    	WhoSayHi(s)
    	WhoSayHi(t)
    	WhoSayHi(&str)
    
    	//创建一个切片
    	x := make([]Humaner, 3)
    	x[0] = s
    	x[1] = t
    	x[2] = &str
    
    	fmt.Println("------------------------")
    	//第一个返回下标,第二个返回下标所对应的值
    	for _, i := range x {
    		i.sayHi()
    	}
    
    }
    
    Student[tony,77] sayHi
    Teacher[tom,go] sayHi
    Mystr[Hello Tony] sayHi
    ------------------------
    Student[tony,77] sayHi
    Teacher[tom,go] sayHi
    Mystr[Hello Tony] sayHi

3.接口的继承

 package main
    
    import "fmt"
    
    //定义接口类型
    type Humaner interface {		//子集
    	sayHi()
    }
    
    type Personer interface {		//超集
    	Humaner //匿名字段,继承sayHi()
    	sing(lrc string)
    }
    
    type Student struct {
    	name string
    	id   int
    }
    
    //Student实现了sayHi
    func (stu *Student) sayHi() {
    	fmt.Printf("Student[%s,%d] sayHi\n", stu.name, stu.id)
    }
    
    func (tmp *Student) sing(lrc string) {
    	fmt.Println("Student在唱着:", lrc)
    }
    
    func main() {
    	var i Personer
    	s := &Student{"Tony", 66}
    	i = s
    
    	i.sayHi()
    	i.sing("好汉歌")
    }
    
    
    Student[Tony,66] sayHi
    Student在唱着: 好汉歌

4.接口转换

    package main
    
    import "fmt"
    
    //定义接口类型
    type Humaner interface {
    	sayHi()
    }
    
    type Personer interface {
    	Humaner //匿名字段,继承sayHi()
    	sing(lrc string)
    }
    
    type Student struct {
    	name string
    	id   int
    }
    
    //Student实现了sayHi
    func (stu *Student) sayHi() {
    	fmt.Printf("Student[%s,%d] sayHi\n", stu.name, stu.id)
    }
    
    func (tmp *Student) sing(lrc string) {
    	fmt.Println("Student在唱着:", lrc)
    }
    
    func main() {
    	//超集可以转换成子集,反过来不可以
    	var iPro Personer
    	iPro = &Student{"mike", 777}
    
    	var i Humaner
    
    	//iPro = i //err
    	i = iPro
    	i.sayHi()
    
    }
    
    
    Student[mike,777] sayHi

5.空接口

    package main
    
    import "fmt"
    
    //定义这样的方法可以
    func xxx(arg ...interface{}) {
    
    }
    
    func main() {
    	//空接口万能类型,保存任意类型的值
    	var i interface{} = 1
    	fmt.Println("i = ", i)
    
    	i = "abc"
    	fmt.Println("i = ", i)
    
    }
    
    
    i =  1
    i =  abc

6.类型判断之断言

    package main
    
    import "fmt"
    
    type Cat struct {
    	name string
    	id   int
    }
    
    func main() {
    	i := make([]interface{}, 3)
    	i[0] = 1
    	i[1] = "hello go"
    	i[2] = Cat{"tom", 3}
    
    	for index, data := range i {
    		if value, ok := data.(int); ok == true {
    			fmt.Printf("x[%d] 类型为int,内容为%d\n", index, value)
    		} else if value, ok := data.(string); ok == true {
    			fmt.Printf("x[%d] 类型为string,内容为%s\n", index, value)
    		} else if value, ok := data.(Cat); ok == true {
    			fmt.Printf("x[%d] 类型为Cat,name = %s,id =%d\n ", index, value.name, value.id)
    		}
    	}
    
    }
    
    
    x[0] 类型为int,内容为1
    x[1] 类型为string,内容为hello go
    x[2] 类型为Cat,name = tom,id =3

7.类型判断之switch

    package main
    
    import "fmt"
    
    type Cat struct {
    	name string
    	id   int
    }
    
    func main() {
    	i := make([]interface{}, 3)
    	i[0] = 1
    	i[1] = "hello go"
    	i[2] = Cat{"tom", 3}
    
    	for index, data := range i {
    		switch value:=data.(type) {
    		case int:
    			fmt.Printf("x[%d] 类型为int,内容为%d\n", index, value)
    		case string:
    			fmt.Printf("x[%d] 类型为string,内容为%s\n", index, value)
    		case Cat:
    			fmt.Printf("x[%d] 类型为Cat,name = %s,id =%d\n ", index, value.name, value.id)
    		}
    	}
    }
    
    
    x[0] 类型为int,内容为1
    x[1] 类型为string,内容为hello go
    x[2] 类型为Cat,name = tom,id =3
发布了45 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010436867/article/details/80809134