结构体值接收者和指针接收者实现接口的区别
值接收者
如果结构体中的方法是值接收者,那么实例化后的结构体值类型和指针类型都可以赋值给接口变量
指针接收者
如果结构体中的方法是指针接收者,那么只有实例化后的指针类型可以赋值给接口变量,结构体值类型不能赋值给接口变量
- demo
定义一个Animal接口,Animal中有两个方法,分别是SetName和GetName,分别让Gog结构体和Cat结构体实现接口中的方法
type Animaler interface {
SetName(string)
GetName() string
}
type Dog struct {
Name string
}
func (d *Dog) SetName(name string) {
d.Name = name
}
func (d *Dog) GetName() string {
return d.Name
}
type Cat struct {
Name string
}
func (c *Cat) SetName(name string){
c.Name = name
}
func (c Cat) GetName() string {
return c.Name
}
func main() {
// Dog实现Animal接口
d := &Dog{
Name:"二狗",
}
var d1 Animaler = d
fmt.Println(d1.GetName())
d1.SetName("阿奇")
fmt.Println(d1.GetName())
// Cat实现Animal接口
c := &Cat{
Name:"花花",
}
var c1 Animaler = c
fmt.Println(c1.GetName()
//二狗
//阿奇
//花花
}
- 一个结构体实现多个接口
type Animaler1 interface {
SetName(string)
}
type Animaler2 interface {
GetName() string
}
type Dog struct {
Name string
}
func (d *Dog) SetName(name string) {
d.Name = name
}
func (d *Dog) GetName() string {
return d.Name
}
type Cat struct {
Name string
}
func (c *Cat) SetName(name string){
c.Name = name
}
func (c Cat) GetName() string {
return c.Name
}
func main() {
d := &Dog{
Name:"二狗",
}
//让dog实现Animaler1接口
var d1 Animaler1 = d
//让dog实现Animaler2接口
var d2 Animaler2 = d
d1.SetName("小花狗")
fmt.Println(d2.GetName())
}
接口嵌套
在Golang中允许接口嵌套,实现新接口
type Ainterface interface {
SetName(string)
}
type Binterface interface {
GetName() string
}
//接口嵌套
type Animaler interface {
Ainterface
Binterface
}
type Dog struct {
Name string
}
func (d *Dog) SetName(name string) {
d.Name = name
}
func (d *Dog) GetName() string {
return d.Name
}
func main() {
//让dog实现Animaler接口
d := &Dog{
Name:"二狗",
}
var d1 Animaler = d
d1.SetName("小花狗")
fmt.Println(d1.GetName())
}
切片/结构体赋值给空接口类型的对象,不能直接获取到切片/结构体中具体的某个值
type Address struct {
Name string
Phone int
}
func main() {
var userInfo = make(map[string]interface{})
userInfo["userName"] = "张三"
userInfo["age"] = 20
userInfo["hobby"] = []string{"吃饭","睡觉","打豆豆"}
fmt.Println(userInfo["age"])
fmt.Println(userInfo["hobby"])
//fmt.Println(userInfo["hobby"][1])
//interface{} does not support indexing 空接口类型不支持索引
hobby2,_ := userInfo["hobby"].([]string)
fmt.Println(hobby2[1])//睡觉
var address = Address {
Name:"李四",
Phone:13912345678,
}
fmt.Println(address.Name)//李四
userInfo["address"] = address
fmt.Println(userInfo["address"])//{李四 13912345678}
//var name = userInfo["address"].Name
//type interface {} is interface with no methods空接口中没有name方法
address2,_ := userInfo["address"].(Address)
fmt.Println(address2.Name)//李四
}
有疑问加站长微信联系(非本文作者)