go 接口
来源:原创
时间:2019-03-08
作者:脚本小站
分类:GoLang
接口的定义和实现:
package main import "fmt" type Humaner interface { sayhi() } type Student struct { id int name string } type Teacher struct { addr string group string } func (temp *Student) sayhi() { fmt.Printf("%d %s\n", temp.id, temp.name) } func (temp *Teacher) sayhi() { fmt.Printf("%s %s\n", temp.addr, temp.group) } func main() { var i Humaner s := &Student{12, "haha"} i = s i.sayhi() t := &Teacher{"aaaa", "bbbb"} i = t i.sayhi() }
多态:
package main import "fmt" type Humaner interface { sayhi() } type Student struct { id int name string } type Teacher struct { addr string group string } func (temp *Student) sayhi() { fmt.Printf("%d %s\n", temp.id, temp.name) } func (temp *Teacher) sayhi() { fmt.Printf("%s %s\n", temp.addr, temp.group) } func WhoSayHi(i Humaner) { i.sayhi() } func main() { s := &Student{1, "demo"} t := &Teacher{"aaaa", "bbbbb"} WhoSayHi(s) WhoSayHi(t) x := make([]Humaner, 2) x[0] = s x[1] = t for _, i := range x { i.sayhi() } }
接口继承:
package main import "fmt" type Student struct { name string id int } type Humaner interface { sayhi() } type Personer interface { Humaner sing(lrc string) } func (s *Student) sayhi() { fmt.Println("sayhi", s.name, s.id) } func (s *Student) sing(lrc string) { fmt.Println("sing", s.name, s.id, lrc) } func main() { var i Personer s := &Student{"aaa", 1} i = s i.sayhi() i.sing("dddddd") }
空接口:
package main import "fmt" // 可以传递任意类型的参数 func Abc(arg ...interface{}) { fmt.Println(arg) } func main() { // 可以保存任意类型的值 var i interface{} = 1 fmt.Println(i) i = "abc" fmt.Println(i) Abc("deddee", 123, "hahahah") }
通过 if 判断类型:
package main import "fmt" type Student struct { id int name string } func main() { i := make([]interface{}, 3) i[0] = 1 i[1] = "hello" i[2] = Student{666, "hahahah"} for index, data := range i { if value, ok := data.(int); ok == true { fmt.Println(index, value) } else if value, ok := data.(string); ok == true { fmt.Println(index, value) } else if value, ok := data.(Student); ok == true { fmt.Println(index, value) } } }
通过switch判断类型:
package main import "fmt" type Student struct { id int name string } func main() { i := make([]interface{}, 3) i[0] = 1 i[1] = "hello" i[2] = Student{666, "hahahah"} for index, data := range i { switch value := data.(type) { case int: fmt.Println(index, value) case string: fmt.Println(index, value) case Student: fmt.Println(index, value) } } }