Golang中的interface代码和允许效果

Chole121 · · 3448 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

先说说接口,接口我理解为一些行为的集合。先来看看代码和允许效果。

package main

import "fmt"

type TypeCalculator interface {
    TypeCal() string
}

type Worker struct {
    Type int
    Name string
}

type Student struct {
    Name string
}

func (w Worker) TypeCal() string {
    if w.Type == 0 {
        return w.Name +"是蓝翔毕业的员工"
    } else {
        return w.Name+"不是蓝翔毕业的员工"
    }
}

func (s Student) TypeCal() string  {
    return s.Name + "还在蓝翔学挖掘机炒菜"
}

func main() {
    worker := Worker{Type:0, Name:"小华"}
    student := Student{Name:"小明"}
    workers := []TypeCalculator{worker, student}
    for _, v := range workers {
        fmt.Println(v.TypeCal())
    }
}
//运行效果
//小华是蓝翔毕业的员工
//小明还在蓝翔学挖掘机炒菜

开始解释

1. 首先我们写了一个interface,里面有个待实现的方法TypeCal()

type TypeCalculator interface {
    TypeCal() string
}

2. 又写了两个结构体Worker和Student

type Worker struct {
    Type int
    Name string
}

type Student struct {
    Name string
}

3. 分别为他们实现了一个与结构体中同名的函数

func (w Worker) TypeCal() string {
    if w.Type == 0 {
        return w.Name + "是蓝翔毕业的员工"
    } else {
        return w.Name + "不是蓝翔毕业的员工"
    }
}

func (s Student) TypeCal() string {
    return s.Name + "还在蓝翔学挖掘机炒菜"
}

4. 分别创建worker和student的实例

worker := Worker{Type:0, Name:"小华"}
student := Student{Name:"小明"}

5. 重点来了,把这两个实例放同一个TypeCalculator的切片中

workers := []TypeCalculator{worker, student}

6. 遍历这个切片,并调用切片中的函数打印结果

for _, v := range workers {
    fmt.Println(v.TypeCal())
}

简单分析

从结果上看,确实是不同的实例调用的是各自的函数,这个函数和interface中的函数名和返回值是相同的。那么加入要是某个实例没有实现interface中的函数呢?当把Student对应的函数注释掉,然后再运行程序,程序报错如下(用我的散装英语翻译就是,Student 没有实现TypeCalculator,TypeCal这个函数/方法找不到)

 Student does not implement TypeCalculator (missing TypeCal method)

感谢作者:小小程序员Eric
查看原文:Golang中的interface,一看就明白

添加小编微信:grey0805,加入知识学习小分队~!


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Chole121

查看原文:Golang中的interface代码和允许效果

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3448 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传