Skip to content

接口

  • 可以作为数据类型使用,相当于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")
}