Golang中interface的基本用法详解

Golang中interface的基本用法详解

什么是interface

interface 是一组需要实现的方法的列表。类似于其他语言中的抽象类,interface 是 Golang 中实现多态的机制之一。具有相同行为特征的实现方法就可以可以实现相同的 interface,相同的 interface 可被相互替换使用。interface 可以理解为是一种规范,接口是一种能力。

在 Golang 中,interface 是一个接口类型,通常定义如下:

type InterfaceName interface {
    MethodName1(args) ReturnType
    MethodName2(args) ReturnType
    // ...
}

interface 由 InterfaceName + 方法列表组成。其中,InterfaceName 是 interface 的名称,它是一个 Go 类型。方法列表是 interface 包含的方法,方法名+参数列表+返回值都被包含在内。

interface 的基本使用

声明 interface 类型变量

在 Golang 中,interface 类型变量可以存储具有相同方法的任何类型的值。比如:

type Animal interface {
    Say() string
}

type Cat struct{}

func (c Cat) Say() string {
    return "猫:喵喵喵"
}

type Dog struct{}

func (d Dog) Say() string {
    return "狗:汪汪汪"
}

func main() {
    var a Animal
    c := Cat{}
    d := Dog{}
    a = c
    fmt.Println(a.Say()) // 猫:喵喵喵
    a = d
    fmt.Println(a.Say()) // 狗:汪汪汪
}

上述代码中,Animal 是一个 interface。它包含一个 Say() 方法。Cat 和 Dog 类型都实现了 Say() 方法,因此它们可以被赋值给 Animal 类型的变量。在 main 函数中,定义了变量 a,它的类型为 Animal。首先把 Cat 的实例赋值给 a,然后执行 a.Say() 输出“猫:喵喵喵”,接着又将 Dog 的实例赋值给 a,执行 a.Say() 输出“狗:汪汪汪”。

判断变量是否实现了某个 interface

在 Golang 中,可以使用 type assertion 和 comma-ok 来判断变量是否实现了某个 interface。

type Animal interface {
    Say() string
}

type Cat struct{}

func (c Cat) Say() string {
    return "猫:喵喵喵"
}

func main() {
    var a interface{} = Cat{}
    animal, ok := a.(Animal)
    if ok {
        fmt.Println(animal.Say()) // 猫:喵喵喵
    } else {
        fmt.Println("转换失败!")
    }
}

上述代码中,首先定义了一个 Cat 类的实例 a,然后通过 a.(Animal) 进行类型转换,如果类型转换成功,则表示变量 a 是 Animal 类型。这个方式有一个问题,就是必须明确地知道变量 a 的类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Golang中interface的基本用法详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 用FileZilla server搭建FTP服务器的图文教程附相关问题解决方法

    使用FileZilla Server搭建FTP服务器的图文教程 什么是FTP服务器? FTP是File Transfer Protocol的缩写,意为“文件传输协议”。FTP服务器就是提供FTP服务的服务器,可以通过FTP协议来进行文件传输或与FTP客户端进行交互。 FileZilla Server的安装 首先,下载FileZilla Server软件,并进…

    other 2023年6月27日
    00
  • 正则表达式验证用户名、密码、手机号码、身份证(推荐)

    下面是正则表达式验证用户名、密码、手机号码、身份证的完整攻略: 什么是正则表达式 正则表达式是一种文本模式,用来描述、匹配一系列符合某个规则的字符串。它通常是由一个字符序列构成,包含了一些特殊字符,用来表达一定规则的字符串。 用户名验证 在用户名验证中,我们通常要求用户名由字母、数字或者下划线组成,长度在6到20之间。下面是对应的正则表达式: /^[a-zA…

    other 2023年6月27日
    00
  • 零基础详解C语言指针进阶

    零基础详解C语言指针进阶 1. 指针的概念 指针是一种类型,用于存储内存地址。在C语言中,使用指针可以实现对任意内存位置的读写操作,并且可以作为函数参数,从而实现函数之间的数据传递。 2. 指针的创建和赋值 指针的创建和赋值可以分为以下两种方式: 2.1 方式一:通过取地址符&获取变量地址 int a = 10; int *p = &a; 在…

    other 2023年6月27日
    00
  • perl uc,lc,ucfirst,lcfirst大小写转换函数

    Perl大小写转换函数攻略 Perl提供了几个函数用于进行大小写转换,包括uc、lc、ucfirst和lcfirst。下面是对每个函数的详细说明和示例: uc函数 uc函数用于将字符串转换为大写形式。 my $str = \"hello world\"; my $uc_str = uc($str); print $uc_str; # 输出…

    other 2023年8月16日
    00
  • AngularJS控制器controller正确的通信的方法

    AngularJS控制器(controller)正确的通信方法攻略 在AngularJS中,控制器(controller)之间的正确通信对于构建复杂的应用程序至关重要。下面是一些可以帮助你实现正确通信的方法和示例说明。 1. 使用服务(service)进行通信 AngularJS中的服务(service)是用于在不同控制器之间共享数据和功能的理想方式。你可以…

    other 2023年8月19日
    00
  • Java堆内存又溢出了!教你一招必杀技(推荐)

    Java堆内存溢出攻略 Java堆内存溢出是Java应用程序中常见的问题之一。本攻略将详细讲解如何解决Java堆内存溢出问题,并提供两个示例说明。 1. 了解Java堆内存溢出 Java堆内存是用于存储对象实例的区域,当应用程序创建的对象数量超过堆内存的限制时,就会发生堆内存溢出。这通常是由于内存泄漏或者对象生命周期管理不当引起的。 2. 分析堆内存溢出错误…

    other 2023年8月2日
    00
  • vmware15安装破解及使用教程

    以下是关于“VMware 15安装破解及使用教程”的完整攻略: 步骤1:下载VMware 15 首先,需要从官方网站或其他可靠来源下载VMware 15安装程序。可以使用以下链接下载VMware 15: VMware官方网站 步骤2:安装VMware 15 在下载VMware 15安装程序后,可以使用以下步骤安装VMware 15: 双击安装程序,开始安装V…

    other 2023年5月7日
    00
  • prometheus安装

    Prometheus安装的完整攻略 Prometheus是一款开源的监控系统,用于监控各种应用程序和系统组件。本文将介绍如何在Linux系统上安装和配置Prometheus,包括以下步骤: 安装Prometheus 配置Prometheus 添加监控目标 示例1:监控Node.js应用程序 示例2:监控MySQL数据库 步骤1:安装Prometheus 在L…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部