Appearance
接口
- 可以作为数据类型使用,相当于
any类型 - 可以作为抽象类型使用,定义了一个对象的行为规范,只包含方法签名,不包含具体实现。
- 使用场景:统合多个类型平台,实现多态性。例如:设置一个数据库接口,不同的数据库实现可以实现这个接口。
作为数据类型
- 相当于
any类型,它可以存储任意类型的值。
go
// 表示 name为任意类型
var a1 interface{}
a1 = "zouyl"
a1 = 123
a2 = []string{"zouyl", "123"}
fmt.Println(a1, a2)作为抽象类型
- 接口定义了一个对象的行为规范,只包含方法签名,不包含具体实现。
- 接口可以被任何结构体实现,实现了接口的结构体可以被转换为接口类型。
go
// 定义一个动物接口
type Animal interface {
Eat()
}
type Dog struct {
Name string
Age int
}
// 实现接口
func (d *Dog) Eat() {
fmt.Println(m.Name, "is eating")
}
type Cat struct {
Name string
Age int
}
// 实现接口
func (c *Cat) Eat() {
fmt.Println(c.Name, "is eating")
}
// 实例化一个dog对象
var dog Animal
dog = &Dog{Name: "zouyl", Age: 3}
// 实例化一个cat对象
var cat Animal
cat = &Cat{Name: "zouyl", Age: 5}
// 多态实现
func Feed(a Animal) {
a.Eat()
}
Feed(dog)
Feed(cat)类型断言
- 类型断言用于将接口类型转换为指定类型,其语法为:
value.(T) - 只能把interface类型转换为指定类型。
go
var str interface{} = "string"
// 断言为字符串类型
newStr, ok := str.(string)
if ok {
fmt.Printf("'%s' is a string\n", newStr)
} else {
fmt.Println("conversion failed")
}