七、golang基础之interface与类型断言

文章目录

  • 一、接口(Interface)
    • (一)概述
    • (二)定义接口
    • (三)实现接口
    • (四)接口的使用
  • 二、类型断言(Type Assertion)
    • (一)概述
    • (二)语法
    • (三)示例代码
    • (四)注意事项
      • 1.注意事项
      • 2.类型断言的安全性
      • 3.接口与继承
      • 4.结论

Go语言是一种简洁、高效、可靠的编程语言,广泛应用于并发编程和系统级开发。其中,接口(interface)和类型断言(type assertion)是Go语言中重要的特性之一。本文将深入探讨Go语言中的接口和类型断言,介绍它们的概念、用法以及使用时的注意事项。

一、接口(Interface)

(一)概述

接口是Go语言中一种抽象类型,它定义了一组方法(方法集),但没有具体实现。通过接口,我们可以定义对象的行为和功能,而无需关心具体对象的类型。接口的存在使得代码更加灵活、可扩展,并提供了良好的代码复用机制。

(二)定义接口

在Go语言中,可以通过type关键字和interface{}类型来定义接口。接口的定义通常包含一系列方法签名,即方法的名称、参数列表和返回值。
以下是一个示例代码,定义了一个简单的接口Shape:

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

在上述代码中,我们定义了一个名为Shape的接口,它包含了两个方法签名:Area()和Perimeter()。这两个方法都没有具体实现,只是定义了方法的名称和返回值。

(三)实现接口

要实现一个接口,需要在具体类型上定义接口中定义的所有方法。只有所有方法都被实现,才能说该类型实现了相应的接口。

以下是一个示例代码,展示了如何在结构体类型上实现接口:

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

(四)接口的使用

在使用接口时,我们可以将实现了接口的对象赋值给接口类型的变量。通过这种方式,我们可以隐藏具体对象的类型,只使用接口来调用方法。

以下是一个示例代码,展示了如何使用接口:

func main() {var s Shapes = Rectangle{width : 10,height : 5}fmt.Println("Area:", s.Area())fmt.Println("Perimeter:", s.Perimeter())}

在上述代码中,我们创建了一个接口类型的变量s,并将一个具体对象Rectangle赋值给它。然后,我们可以使用接口变量s来调用Area()和Perimeter()方法,而无需关心具体对象的类型。

二、类型断言(Type Assertion)

(一)概述

类型断言是一种在Go语言中将接口类型转换为具体类型的操作。通过类型断言,我们可以在运行时判断接口变量的底层类型,并将其转换为指定的类型。类型断言的存在使得我们可以在需要时以正确的类型使用接口变量。

(二)语法

在Go语言中,可以使用以下两种语法进行类型断言:

x.(T):将接口类型x转换为类型T。
x, ok := y.(T):将接口类型y转换为类型T,并检查转换是否成功。

如果类型断言失败,将会触发运行时错误。为了避免这种情况,我们可以使用第二种语法并检查转换是否成功。

(三)示例代码

func printArea(s Shape) {if rect, ok := s.(Rectangle); ok {fmt.Println("Rectangle Area:", rect.Area())} else if circle, ok := s.(Circle); ok {fmt.Println("Circle Area:", circle.Area())} else {fmt.Println("Unknown Shape")}
}func main() {var s Shapes = Rectangle{width: 10, height: 5}printArea(s)s = Circle{radius: 5}printArea(s)
}

在上述代码中,我们定义了一个名为printArea的函数,它接收一个Shape类型的参数,并对不同类型的形状计算并打印面积。在函数内部,我们使用类型断言将接口变量s转换为具体类型Rectangle和Circle,然后调用它们的Area()方法。

(四)注意事项

1.注意事项

接口的多态性使得我们可以使用一个接口类型的变量来引用不同的具体类型的对象。这种灵活性提供了很大的便利,但也增加了一些风险。在使用接口变量时,要确保变量的底层类型实现了接口中定义的所有方法,以避免运行时错误。

2.类型断言的安全性

类型断言是一种将接口类型转换为具体类型的操作,但在进行类型断言时,需要注意类型的匹配性。如果类型断言失败,将会触发运行时错误。为了避免这种情况,应该始终使用第二种语法并检查转换是否成功。

3.接口与继承

在其他编程语言中,接口通常被用作实现继承。但在Go语言中,接口不同于传统的继承机制。接口实际上是通过一个对象的行为来定义的,而不是通过它的属性。因此,在设计接口时,应该更关注对象的行为和功能,而不是它的具体类型。

4.结论

深入探讨了Go语言中的接口和类型断言。我们介绍了接口的概念、定义和使用方法,并展示了如何在具体类型上实现接口。同时,我们还详细讨论了类型断言的用法和注意事项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins打包java项目报错Error: Unable to access jarfile tlm-admin.jar

jenkins打包boot项目 自动重启脚本失败 查看了一下项目日志报错: Error: Unable to access jarfile tlm-admin.jar我检查了一下这个配置,感觉没有问题,包可以正常打, cd 到项目目录下面,手动执行这个sh脚本也是能正常…

基于java+springboot+vue实现的作业管理系统(文末源码+Lw)110

基于SpringBootVue的实现的作业管理系统(源码数据库万字Lun文流程图ER图结构图演示视频软件包) 功能描述: 作业管理系统有管理员,教师,学生三个角色。教师和学生都可以进行注册然后再登录。学生可以修改自己的密码&…

总结之企业微信(一)——创建外部群二维码,用户扫码入群

创建外部群 企微接口中没有直接通过服务端API接口创建外部群 可以通过jssdk创建外部群:引用jssdk调用会话接口wx.openEnterpriseChat https://work.weixin.qq.com/api/doc/90000/90136/90511 创建外部群二维码 需要通过企业微信的应用,并且配置客户联…

直播麦克风哪个品牌音质最好,领夹麦克风品牌排行榜前十名推荐

​在这个快节奏的时代,无论是专业播客、商务会议、在线教学还是日常通话,清晰的声音传递已成为沟通的关键。传统的有线麦克风虽好,但在移动性和灵活性上稍显不足。而无线领夹麦克风,以其小巧便携、高保真音质和卓越的抗干扰能力&a…

有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走1秒,满60秒进1分钟,此时秒又从0起算,要求输出分和秒的值

单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的i和--i等。重载单目运算符的方法与重载双目运算符的方法是类似的。但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数&am…

[NLP Begin] Classical NLP Methods - HMM

文章目录 Hidden Markov ModelsInitial State ProbabilitiesHidden state probabilitiesEmission probabilities 参考 Hidden Markov Models 教材上给出了一个例子: Initial State Probabilities 初始概率,举个例子: Noun (N): 0.3 Verb (…

袋鼠云产品支持全栈信创适配,更加安全可靠、自主可控

随着国产替换的深化,企业对信创产品的需求逐渐融合更丰富的业务诉求以及未来数智规划,正从“同类替换”转向“迭代升级”。 当前,袋鼠云的产品与芯片、服务器、数据库、操作系统、中间件、云平台等主流信创厂商全面兼容适配,为企…

体育资讯小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,球员管理,教练管理,赛事日程管理,赛事类型管理,联赛积分榜管理 开发系统:Windows 架构模式:SSM JDK版本&a…

pico+unity3d开启彩色透视

1、点击游戏对象、点击XR、点击添加XR Origin,并把自带的摄像对象删除 2、添加脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.XR.PXR;//引入xr对象 public class toushi : MonoBehaviour {// Start is called…

在一个使用了 Sass 的 React Webpack 项目中安装和使用 Tailwind CSS

要在一个使用了 Sass 的 React Webpack 项目中安装和使用 Tailwind CSS,可以按照以下步骤操作: 1. 安装 Tailwind CSS 及其依赖 首先,确保你的项目根目录下有 package.json 文件,然后运行以下命令来安装 Tailwind CSS 及其所需的…

监控房价和挂牌数量的工具-以成都房价为例

介绍 本文将介绍如何通过zervice提供的工具来监控成都房价(其他城市或者地区类似),包括价格和挂牌数量。可以对购房一族提供数据参考。 数据来源 数据来源方面,本文以成都为例,我们会使用链家数据-> 选择地图找房…

使用Delphi做蓝牙BLE开发的一个问题

概念 Delphi 的 BLE 开发,拖一个 TBlueToothLe 到界面上,使用这个控件,就可以进行 BLE 的开发,比如去连接一个蓝牙手环。 Delphi 自带的 Demo 里面,有一个 BLEScanner 程序,可以作为开发的起点。 问题 …

【解密】记一次辽宁省某综合实践教学管理平台加解密算法分析

最近接到需求,于是准备弄一下,发现对方整个流程是:先加密在请求,请求得到的数据再进行拼接加密,不过花了2个小时还是完成了解密 哈哈 找到请求发现请求数据加密 在启动器里面发现登录方法 打印出各个关键变量数据 …

PyTorch 2-深度学习-模块

PyTorch 2-深度学习-模块 一: pytorch1> pytorch 介绍2> pytorch 作用3> pytorch 优点4> pytorch 流程二:pytorch 模块1> torch.Tensor 模块2> torch.nn模块3> torch.nn.function模块4> torch.random模块5> torch.onnx模块6> torch.sparse模块7…

QT之嵌入外部第三方软件到本窗体中

一、前言 使用QT开发,有时需要调用一些外部程序,但是单独打开一个外部窗口有的场合很不合适,最好是嵌入到开发的QT程序界面中。还有就是自己开发的n个程序,一个主程序托n个子程序,为了方便管理将各个程序独立&#xf…

【TS】typescript 获取函数入参类型、返回值类型、promise返回值类型

文章目录 1. 准备工作2. 获取函数入参的类型3. 获取函数返回值类型4. 获取promise返回值类型 1. 准备工作 创建 utils.ts interface User {id: number;name: string;age: number; } interface Params {method: string;url: string; }function getUserList(params: Params,other…

C语言从头学33——内存管理(一)

一、基本情况 C语言的内存管理分成系统管理与程序员用户手动管理两部分。系统管理的内存,主要是函数内部的变量(局部变量),这部分变量在函数运行时进入内存,这部分内存区域成为"栈区",函数…

vue中使用$set方法给对象添加属性

vue中可以使用$set()给对象添加属性,但不是所有的对象都可以使用,vue中api明确说明,它必须用于向响应式对象上添加属性 响应式对象,vue的响应式原理,可以查看:深入响应式原理 — Vue.js ①对象赋值 this…

读懂一本书

各位好,今天我们要分享的这本书叫作《读懂一本书》。 很不好意思,书的作者是我。并不是我写的所有的书我都一定要讲,我也有很多合辑类的书籍是从来不讲的,我讲过《可复制的领导力》,讲过《低风险创业》,还有今天的这本《读懂一本书》,都是我有一些原创的观点和价值在里…

leetcode热题100.单词拆分(动态规划进阶)

最近参加工作比较忙,抽出时间分享一篇题解,希望对大伙有帮助🎈🎈 今天分享一道动态规划的题目,大家快刷起来吧🦾🦾 Problem: 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字…