12 Go的接口

这篇具有很好参考价值的文章主要介绍了12 Go的接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

        在上一节的内容中,我们介绍了Go的作用域,包括:局部作用域、全局作用域、命名空间作用域等。在本节中,我们将介绍Go的接口。Go语言中的接口是一种类型,它定义了一组函数的集合。接口是一种抽象的描述,它定义了一个对象的行为,而不关心对象的具体类型。通过接口,可以实现多态性,即一个对象可以实现多个接口,从而实现不同接口的行为。

        在Go语言中,接口是一种定义了一组函数签名的抽象类型。这些函数签名包括:函数的名称、参数列表和返回类型。一个类型如果满足某个接口的所有函数,则称该类型实现了该接口。

定义接口

        可以通过type关键字和大括号{}来定义接口,其定义格式如下:

type 接口名称 interface {
    函数1(参数列表) 返回值列表
    函数2(参数列表) 返回值列表
    // 更多函数
}

        在下面的示例代码中,我们定义了一个名为Shape的接口,其中包含Area()和Perimeter()两个函数。

type Shape interface {
    Area() float64
    Perimeter() float64
}

实现接口

        要实现一个接口,需要在类型中实现接口中定义的所有函数。另外,函数的签名必须与接口中定义的函数一致。Go语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有函数,那么它就自动地实现了该接口。

        在下面的示例代码中,Rectangle类型实现了Shape接口的所有函数。这样,Rectangle对象就可以赋值给Shape类型的变量,并且可以通过Shape类型的变量调用这些函数。

type Rectangle struct {
    width float64
    height float64
}
  
func (r Rectangle) Area() float64 {
    return r.width * r.height
}
  
func (r Rectangle) Perimeter() float64 {
    return 2 * (r.width + r.height)
}

使用接口

        使用接口时,可以将实现了接口的类型赋值给接口类型的变量。比如:可以将一个Rectangle类型的结构体赋值给Shape接口类型的变量s,赋值后,变量s引用了Rectangle类型,并且可以使用Shape接口中定义的函数。

        在下面的示例代码中,我们首先定义了一个Shape接口,它包含了两个函数:Area()和Perimeter()。然后,我们分别定义了Rectangle和Circle两个结构体,并为它们实现了Area()和Perimeter()函数。这两个结构体分别实现了Shape接口的函数,因此它们可以被赋值给Shape类型的变量。在main()函数中,我们分别创建了一个矩形和一个圆形对象,并将它们赋值给了Shape接口变量s。最后,我们通过调用s.Area()和s.Perimeter()函数来计算它们的面积和周长,并打印结果。

package main

import "fmt"

// 定义一个形状的接口
type Shape interface {
    Area() float64
    Perimeter() float64
}

// 定义一个矩形结构体,并实现Shape接口的函数
type Rectangle struct {
    width float64
    height float64
}
  
func (r Rectangle) Area() float64 {
    return r.width * r.height
}
  
func (r Rectangle) Perimeter() float64 {
    return 2 * (r.width + r.height)
}

// 定义一个圆形结构体,并实现Shape接口的函数
type Circle struct {
    radius float64
}
  
func (c Circle) Area() float64 {
    return 3.14 * c.radius * c.radius
}
  
func (c Circle) Perimeter() float64 {
    return 2 * 3.14 * c.radius
}

func main() {
    rectangle := Rectangle{width: 66, height: 10}
    // /将Rectangle对象赋值给Shape接口类型的变量
    var shape Shape = rectangle
  
    // 调用Shape接口的函数
    fmt.Println("Area:", shape.Area())
    fmt.Println("Perimeter:", shape.Perimeter())

    circle := Circle{radius: 10}
    // /将Circle对象赋值给Shape接口类型的变量
    shape = circle
  
    // 调用Shape接口的函数
    fmt.Println("Area:", shape.Area())
    fmt.Println("Perimeter:", shape.Perimeter())
}

        在Go语言中,接口提供了一种抽象的描述,可以用来定义对象的行为,任何实现了接口中定义的所有函数的类型都被认为是实现了该接口。通过使用接口,我们可以实现多态性、组合和依赖注入等功能,使代码更加灵活、可复用和易于维护。

空接口

        在Go语言中,空接口是一种特殊的接口类型,它没有任何函数定义。空接口可以表示任何类型的值,因为它没有任何限制。空接口的定义使用一对空的大括号来表示,如下:

          var emptyInterface interface{}

        通过将一个值赋给空接口变量,可以将其转换为任意类型。其他任何类型的值都可以赋值给空接口变量,因为空接口可以适应任何类型。

        在下面的示例代码中,我们声明了一个空接口变量emptyVar,然后分别将其赋值为整数、字符串和自定义结构体类型。由于空接口可以适应任何类型,这些赋值都是有效的。

package main

import "fmt"

func main() {
    var emptyVar interface{}
    emptyVar = 66
    // 输出: 66
    fmt.Println(emptyVar)
  
    emptyVar = "Hello, CSDN"
    // 输出: Hello, CSDN
    fmt.Println(emptyVar)
  
    type Person struct {
        name string
        age  int
    }
    emptyVar = Person{name: "Mike", age: 32}
    // 输出: {Mike 32}
    fmt.Println(emptyVar)
}

        使用空接口可以在程序中实现更灵活和可扩展的逻辑,但需要注意的是:使用空接口时需要小心类型转换的安全性,因为空接口变量中存储的值可能与你预期的类型不同。建议在使用空接口时,进行类型断言以确保类型的安全性。文章来源地址https://www.toymoban.com/news/detail-753179.html

到了这里,关于12 Go的接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang生成12个月

    2024年02月03日
    浏览(35)
  • 【Golang】go交叉编译

    交叉编译是用来在一个平台上生成另一个平台的可执行程序 。Go 命令集是原生支持交叉编译的。 Mac下编译:Linux 或 Windows 的可执行程序 Linux下编译:Mac 或 Windows的可执行程序 Windows下编译:Mac 或 Linux的可执行程序 需要写一个批处理程序,在里面去设置,因为windows 下的 ter

    2024年02月10日
    浏览(38)
  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(50)
  • 【Golang】go条件编译

    交叉编译只是为了能在一个平台上编译出其他平台可运行的程序,Go 作为一个跨平台的语言,它提供的类库势必也是跨平台的,比如说程序的系统调用相关的功能,能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,

    2024年02月11日
    浏览(49)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(43)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(47)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(46)
  • golang 中 go func() {} 理解

    在Golang 中,go func() {} 表示创建一个新的 Goroutine(轻量级线程),用于异步执行函数。 具体来说,go func() {} 创建了一个匿名函数(即没有函数名的函数),并在其前面加上 go,以表示该函数应该在一个新的 Goroutine 中异步执行。因此,当程序执行到该语句时,它会立即

    2024年02月15日
    浏览(30)
  • Golang - go build打包文件

    Go编译打包文件 1、简单打包 程序 main1.go: 打包: # 在linux服务上执行下面的3个命令 执行: 2、打包时为程序中的变量设置值 程序 main2.go : 打包:打包方式和上面一样,这里只介绍linux下的打包。 # 在linux服务上执行下面的命令 执行: 3、打包时指定名称 执行: go build的时

    2024年02月09日
    浏览(30)
  • 【Golang中的Go Module使用】

    Golang中的Go Module是一个用于包管理和版本控制的工具。在本文中,我们将深入探讨Go Module的相关知识,包括其定义、使用方法以及一些常见的应用场景。 Go Module是Golang中的包管理和版本控制工具,它的发展历程、用法、意义以及相关指令都对于Golang开发者来说非常重要。在本

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包