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
写入自己的博客中才能记得长久