0
点赞
收藏
分享

微信扫一扫

golang 怎么使用接口中声明的方法

使用接口

假设你有一个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 类型的方法。
}



举报

相关推荐

0 条评论