接口的实现
package main
import "fmt"
type Animal interface {
//出生
SayHelloWord()
//死亡
Godie()
//生活
Live(food string) (Energy int)
}
type Pig struct {
Name string
}
/*猪的指针实现了动物接口*/
//出生
func (p *Pig)SayHelloWord(){
fmt.Printf("%s哼哼哼
",p.Name)
}
//死亡
func (p *Pig)Godie(){
fmt.Printf("%s啊啊啊我死了
",p.Name)
}
//生活
func (p *Pig)Live(food string) (Energy int){
fmt.Printf("%s食用了一些%s,生产了%d卡路里
",p.Name,food,1200)
return 1200
}
type Cat struct {
Name string
}
/*猫的指针实现了动物接口*/
//出生
func (c *Cat)SayHelloWord(){
fmt.Printf("%s出生了
",c.Name)
}
//死亡
func (c *Cat)Godie(){
fmt.Printf("%s:糟了life-=1
",c.Name)
}
//生活
func (c *Cat)Live(food string)(Energy int){
fmt.Printf("铲屎官给%s大人服用了一些%s
",c.Name,food)
return 1
}
func main031() {
var animal Animal
/*一个动物实例,既可以指向一只猪的指针,又可以指向一只猫的指针*/
//animal = &Pig{"佩奇"}
animal = &Cat{"加菲"}
/*无视当前的animal的具体类型,调度其动物的共性*/
animal.SayHelloWord()
animal.Godie()
animal.Live("饲料")
}
/*开一个肉联厂*/
func main() {
animals := make([]Animal, 0)
animals = append(animals, &Pig{"佩奇"})
animals = append(animals, &Cat{"加菲"})
for _,animal := range animals{
animal.Live("饲料")
animal.Godie()
}
}
接口的类型断言
package main
import "fmt"
type Animal interface {
//出生
SayHelloWord()
//死亡
Godie()
//生活
Live(food string) (Energy int)
}
type Pig struct {
Name string
}
/*猪的指针实现了动物接口*/
//出生
func (p *Pig)SayHelloWord(){
fmt.Printf("%s哼哼哼
",p.Name)
}
//死亡
func (p *Pig)Godie(){
fmt.Printf("%s啊啊啊我死了
",p.Name)
}
//生活
func (p *Pig)Live(food string) (Energy int){
fmt.Printf("%s食用了一些%s,生产了%d卡路里
",p.Name,food,1200)
return 1200
}
func (p *Pig)Gongniba() {
fmt.Printf("%s在拱泥巴
", p.Name)
}
type Cat struct {
Name string
}
/*猫的指针实现了动物接口*/
//出生
func (c *Cat)SayHelloWord(){
fmt.Printf("%s出生了
",c.Name)
}
//死亡
func (c *Cat)Godie(){
fmt.Printf("%s:糟了life-=1
",c.Name)
}
//生活
func (c *Cat)Live(food string)(Energy int){
fmt.Printf("铲屎官给%s大人服用了一些%s
",c.Name,food)
return 1
}
func (c *Cat)Gulu() {
fmt.Printf("%s咕噜咕噜
",c.Name)
}
func main031() {
var animal Animal
/*一个动物实例,既可以指向一只猪的指针,又可以指向一只猫的指针*/
//animal = &Pig{"佩奇"}
animal = &Cat{"加菲"}
/*无视当前的animal的具体类型,调度其动物的共性*/
animal.SayHelloWord()
animal.Godie()
animal.Live("饲料")
}
/*开一个肉联厂*/
func main() {
animals := make([]Animal, 0)
animals = append(animals, &Pig{"佩奇"})
animals = append(animals, &Cat{"加菲"})
/* for _,animal := range animals{
switch animal.(type) {
case *Cat:
fmt.Printf("发现一只猫:%v
",animal)
case *Pig:
fmt.Printf("发现一只猪:%v
",animal)
}
}*/
for _,animal := range animals{
cat,ok:= animal.(*Cat)
if ok{
cat.Gulu()
}
fmt.Println(animal,cat,ok)
pig,ok:= animal.(*Pig)
if ok{
pig.Gongniba()
}
fmt.Println(animal,pig,ok)
}
}
空接口与空接口的类型断言
package main
import "fmt"
func main() {
//空接口可以看做各种类型
data := make([]interface{}, 0)
data = append(data, "你妹")
data = append(data, 18)
data = append(data, 0.5)
data = append(data, false)
/*for _,x := range data{
switch x.(type) {
case string:
fmt.Println("发现字符串",x)
case int:
fmt.Println("发现整型",x)
case float64:
fmt.Println("发现浮点型",x)
default:
fmt.Println("发现其他类型",x)
}
}*/
for _,x := range data{
if xStr,ok := x.(string);ok{
fmt.Printf("发现字符串%s,长度是%d
",xStr,len(xStr))
}else {
fmt.Println("其他类型",x)
}
}
}