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)
}
}
}