GO语言面向对象03---接口与断言

接口的实现

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

  

原文地址:https://www.cnblogs.com/yunweiqiang/p/11901923.html