Golang basic_leaming 指针类型和值类型实现接口的区别以及接口嵌套

Posted 知其黑、受其白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang basic_leaming 指针类型和值类型实现接口的区别以及接口嵌套相关的知识,希望对你有一定的参考价值。

阅读目录

值类型实现接口

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 "旺财"


func main() 
	var a Animal
	var d Dog
	a = d
	a.Eat()

	fmt.Printf("%T %v\\n", a, a)


PS E:\\TEXT\\test_go\\two> go run .\\main.go
我在吃骨头
main.Dog 
PS E:\\TEXT\\test_go\\two>

指针接收

以下是,1 值类型接口 和 2 指针类型接口的区别示例。

1 值类型接口

接口变量里及可以存值类型,也可以存指针类型。

指针类型是没有实现 Eat 值类型这个接口的,那么接口里面进行一个转换。

首先取出地址 &Dog,然后对地址取值 *(&Dog) 就变成值类型了,值类型就实现了 Eat 这个方法,所以就调用了。

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 "旺财"


func main() 
	var a Animal
	var d Dog
	a = d
	a.Eat()

	fmt.Printf("%T %v\\n", a, a)

	/*
		指针类型是没有实现 Eat 值类型这个接口的,
		那么接口里面进行一个转换。
		首先取出地址  &Dog,然后对地址取值 *(&Dog) 就变成值类型了,
		值类型就实现了 Eat 这个方法,所以就调用了。
	*/
	var d1 *Dog = &Dog
	a = d1
	a.Eat()
	fmt.Printf("*Dog %T %v", a, a)

2 指针类型接口

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 "旺财"


func main() 
	var a Animal
	var d Dog
	/*
		a 存的是是一个值类型的 Dog,那么调用 a.Eat(),首先要去去 &Dog->Eat()
		如果一个变量存储在接口类型的变量中之后,那么不能获取这个变量的地址。
	*/
	// a = d 这样是存不进去的。
	a = &d
	a.Eat()

	fmt.Printf("%T %v\\n", a, a)

	var d1 *Dog = &Dog
	a = d1
	a.Eat()
	fmt.Printf("*Dog %T %v", a, a)

实现多接口

1 同一个类型可以实现多个接口

package main

import "fmt"

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


type PuruDongWu interface 
	TaiSheng()


type Dog struct 


func (d Dog) Talk() 
	fmt.Println("汪汪汪")


func (d Dog) Eat() 
	fmt.Println("我在吃骨头")


func (d Dog) Name() string 
	fmt.Println("我的名字叫旺财")
	return "旺财"


func (d Dog) TaiSheng() 
	fmt.Println("狗是胎生的")


func main() 
	var d Dog
	var a Animal
	fmt.Println("%v %T %p", a, a, a)
	a = d
	a.Eat()

	// 判断 a 有没有存具体的类型
	if a == nil 
		// a.Eat() 不能直接使用,需要初始化。
		fmt.Println("a is nil")
	

	var b PuruDongWu
	b = d
	b.TaiSheng()

2 接口嵌套,和结构体嵌套类似

package main

import "fmt"

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


type Describle interface 
	Describle() string


type AdvanceAnimal interface 
	Animal
	Describle


// AdvanceAnimal 包含以上四个方法
// 实现 AdvanceAnimal 接口
type Dog struct

func (d Dog) Talk() 
	fmt.Println("汪汪汪")


func (d Dog) Eat() 
	fmt.Println("我在吃骨头")


func (d Dog) Name() string 
	fmt.Println("我的名字叫旺财")
	return "旺财"


func (d Dog) Describle() string 
	fmt.Println("dog is a dong")
	return "dog is a dog"


func main() 
	var d Dog
	var a AdvanceAnimal
	a = d
	a.Describle()
	a.Eat()
	a.Talk()
	a.Name()


PS E:\\TEXT\\test_go\\two> go run .\\main.go
dog is a dong
我在吃骨头
汪汪汪
我的名字叫旺财
PS E:\\TEXT\\test_go\\two>

以上是关于Golang basic_leaming 指针类型和值类型实现接口的区别以及接口嵌套的主要内容,如果未能解决你的问题,请参考以下文章

Golang basic_leaming指针

Golang basic_leaming指针

Golang basic_leaming接口

Golang basic_leaming接口

Golang basic_leaming基本数据类型

Golang basic_leaming基本数据类型