golang 怎么使用接口中声明的方法
  f6j0WN1M39I3 2023年11月19日 13 0

使用接口

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



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  raKFu9QULpEG   2023年12月23日   40   0   0 gogo
  raKFu9QULpEG   2023年12月23日   40   0   0 gogo
  raKFu9QULpEG   2023年12月23日   14   0   0 gogo
  raKFu9QULpEG   2023年12月23日   12   0   0 gogo
  raKFu9QULpEG   2023年12月23日   9   0   0 gogo
  raKFu9QULpEG   2023年12月23日   45   0   0 gogo
  raKFu9QULpEG   2023年12月23日   27   0   0 gogo
f6j0WN1M39I3