使用接口
假设你有一个golang 的 interface,里面声明了1个函数,怎么调用这个函数
type Human interface {
Eat(ctx context.Context, food string}) error
}
使用方式
创建结构体实现这个接口声明的方法,然后创建该结构体对象,调用方法
案例
首先,我们需要创建一个实现了这个接口的结构体:
type Student struct {
// 需要填充结构体的属性。
}
// 确保 Student 实现了 Human 接口
func (stu *Student) Eat(ctx context.Context, food string) error {
// 在这里实现你的函数逻辑
fmt.Printf("煮%v, 开吃", food)
return nil
}
然后,我们就可以创建这个结构体的实例并调用接口函数了:
func main() {
// 创建 Student 结构体的实例
student := &Student{}
// 创建Context
ctx := context.Background()
err := student.Eat(ctx, "鱼肉")
if err != nil {
fmt.Println("eat failed:", err)
return
}
}
提示
只有当某结构体类型实现了接口声明的所有方法,才算是实现了该接口,才能把实现类赋值给接口变量。比如只有当 Student 实现了 Human 接口声明的所有方法,才能把 Student 类型的变量赋值给 Human 接口变量,这在其他语言中也被称之为“多态”(同一个变量在不同时刻场景具有多种形态)。
func main() {
// 创建 Student 结构体的实例
var human *Human
human = &Student{} // 只有当 Student 类型实现了 Human 接口声明的所有方法才能这么赋值,否则会报语法错误
// 创建Context
ctx := context.Background()
err := human.Eat(ctx, "鱼肉")
if err != nil {
fmt.Println("eat failed:", err)
return
}
}
使用继承
在Go语言中,由于没有“类”的概念,所以没有严格意义上的类继承。Go通过在结构体字段中嵌入其他的类型,达到和继承类似的效果,这是Go语言中的组合。
type Human struct {
name string
age int
}
func (stu *Human) Eat(ctx context.Context, food string) error {
// 在这里实现你的函数逻辑
fmt.Printf("煮%v, 开吃", food)
return nil
}
type Student struct {
Human // 嵌入Human类型
grade int
}
func main() {
// 实例化Student
s := Student{Human: Human{name: "Tom", age: 20}, grade: 3}
fmt.Println(s.name, s.age, s.grade) // 继承了Human类型的成员属性
s.Eat(context.Backgroud(), "鱼肉") // 继承了 Human 类型的方法,在该方法被 Student 重写之前,执行的都是 Human 类型的方法。
}