go的interface pointer

点击查看代码
package main

import "fmt"

type Animal interface{
	Talk()
	Eat()
	Name() string
}

type Dog struct{}

func (d *Dog) Talk(){
	fmt.Println("汪汪汪")
}

func (d *Dog) Eat(){
	fmt.Println("狗正在吃骨头")
}

func (d *Dog) Name() string{
	fmt.Println("名字叫旺财")
	return "旺财"
}

type Pig struct{}

func (p Pig) Talk(){
	fmt.Println("嗯呢嗯")
}

func (p Pig) Eat(){
	fmt.Println("猪正在吃")
}


// func (p *Pig) Name() string{  // .\main.go:90:6: cannot use p (type Pig) as type Animal in argument to just:
        // Pig does not implement Animal (Eat method has pointer receiver)    指针类型实现了这个接口的方法,不能放入值类型数据
func (p Pig) Name() string{
	fmt.Println("名字叫旺财猪")
	return "旺财猪"
}

func testInterface1(){
	var a Animal
	var p Pig
	a  = p
	a.Eat()
	a.Talk()
	a.Name()
	fmt.Println("---------------------p1 *Pig = &Pig{}--------------------------------------------------")
	var p1 *Pig = &Pig{} // 值类型实现了Animal接口, 他的指针类型可以存进去
	// *(&Dog).Eat()  // a存的是一个值类型的Dog,那么调用a.Eat()实际转换为调用 &Dog.Eat()之后,
	//如果一个变量存储在接口类型的变量中,那么就不能获取这个变量的地址
	a = p1   // 接口a里面也可以存储指针类型的dog
	a.Eat()

	fmt.Println("---------------------d1 *Dog = &Dog{}--------------------------------------------------")
	var d *Dog
	a = d     //  指针类型实现了Animal接口, 他的值类型存不进去,只能用指针类型
	a.Eat()
	a.Talk()
	a.Name()
}

func just(a Animal){
	switch  v := a.(type){
	case *Dog:
		fmt.Printf("v is dog,%v\n",v)	
	case Pig:
		fmt.Printf("v is pig,%v\n",v)
	default:
		fmt.Println("not support type")
	}
}


func testInterface2(){
	var d *Dog
	just(d)

	var p Pig
	just(p)
}


func main() {
	testInterface1()
	// testInterface2()

}

输出:

点击查看代码
你好啊100==100==int==0xc0000361f0
转化为int ok>> 100
你好啊"hello world"==hello world==string==0xc000036210
0 can't vonvert to int
转化为str ok>> hello world
a is int, value :100
a is string, value :hello
a is int, value :100
a is string, value :hello
posted @ 2022-03-07 23:44  ty1539  阅读(34)  评论(0编辑  收藏  举报