golang的类型断言

news2025/1/17 8:59:03

前言:原因很简单,写的代码panic了。报错如下。为此专门看下golang的类型断言。

“[PANIC]interface conversion: interface {} is string, not float64”。

1、类型断言(assertion)

所谓“类型断言”即判断一个变量是不是某个类型的实例(简单来讲就是判断所属类型)。

举例例子,interface属于一般类型其具体类型是不明确的,当要将其转换成具体类型的时候就要使用类型断言。如果不使用的话一旦类型对不上就会出现类似前面所说的panic。

1.1、类型assertion和类型switch只用作用与interface{}
package main

import (
        "fmt"
)

func main() {
        var v string = "hello" // var v interface{} = "hello"
        s, ok := v.(string)
        fmt.Println("s=", s, ",ok=", ok)

}

对于上述代码会得到如下错误。

1.2、断言失败则会panic

如下前者:v到string的类型assertion成功,返回s等于“hello”

如下后者:v到float64的类型assertion失败,导致panic。

package main

import (
        "fmt"
)

func main() {
        var v interface{} = "hello"
        s := v.(string)
        fmt.Println("s=", s)

        f := v.(float64)  //会painic
        fmt.Println("f=", f)

}
1.3、使用ok的方式避免panic

当assertion失败的时候,ok返回false就不会引发panic行为。

package main

import (
        "fmt"
)

func main() {
        var v interface{} = "hello"
        s, _ := v.(string)
        fmt.Println("s=", s)

        f, ok := v.(float64)
        if ok {
                fmt.Println("f=", f)
        } else {
                fmt.Println("not a float64")
        }

}

执行结果如下:

1.4、v.(type)配合switch进行类型判断

还有一种方式就是v.(type)配合switch进行类型判断。

package main

import (
        "fmt"
)

func main() {
        //var v interface{} = "hello"
        var v interface{} = 1234

        switch t:=v.(type) {
        case string:
                fmt.Println("v is type of string")
        case int:
                fmt.Println("v is type of int")
        case float64:
                fmt.Println("v is type of float64")
        }

}

1.5、小结

v.(T)的写法可以在运行是判断v的值是不是T类型,是的话就直接使用其值,不是则panic;

类型assertion和类型switch非常类似于C++的多态类型之间的转换。

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

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

相关文章

STM32-电源管理(实现低功耗)

电源管理 STM32 HAL库对电源管理提供了完善的函数和命令。 工作模式(高功耗->低功耗):运行、睡眠、停止、待机。 若备份域电源正常供电,备份域内的RTC都可以正常运行,备份域内的寄存器的数据会被保存,不…

制作一个可以arm架构下运行的docker镜像(for Python)

看完本篇文章,你将得到一个可以arm架构下运行的python 基础镜像。 题外话 这里直接说docker镜像有点儿草率,因为目前很多容器都是Podman了。 podman的介绍 arm和aarch傻傻分不清楚 现在这两个是一样的意思了。 arm64和aarch64之间的区别 开始制作镜…

笔记48:51序列模型--课程笔记

本地笔记地址:D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\序列模型 a a a a a a a a a a a a a a a a a a 8.1. 序列模型 — 动手学深度学习 2.0.0 documentation

双十一真香数码好物推荐!相信总有一款适合你!

在这个数字化时代,科技产品已经渗透到我们的日常生活,成为不可或缺的一部分。随着电商平台不断举办各种促销活动,双11购物狂欢节已经成为备受瞩目的盛事。在这场购物狂欢中,数码产品是热门之选。我们都期望在这个特殊的时刻找到高…

微信小程序 如何订阅消息?

微信公众号 微信公众号分为两种类型:订阅号和服务号,它们在功能和使用方式上有一些区别。 1.订阅号(Subscription Account): 主要用于向用户提供信息、资讯、新闻等更新性内容。每天可以发送1条群发消息给所有关注者…

墨者学院 身份认证失效漏洞实战

一、题目信息 二、漏洞利用 1.通过抓包,抓取test登录信息 发现card_id号以及一些回显的账号密码信息 搜索了一下这个id,发现是测试的头像 2.修改id号 分析请求包的逻辑,发现是请求了头像资源后再去请求头像id的详情包,所以根据…

el-dropdown自定义样式,不影响其他组件

原来的样式: 修改后的样式: 给el-dropdown-menu添加类名dropdown-menu <el-dropdown-menu slot"dropdown" class"dropdown-menu"><router-link to"/user/profile"><el-dro…

mysql出现Deadlock死锁排查

参考: https://www.yisu.com/zixun/664543.html 查看mysql死锁日志 show engine innodb status找到信息中LATEST DETECTED DEADLOCK这一行&#xff0c;可以看到mysql的死锁信息详情 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2023-10-31…

VS LiveShare使用操作介绍

VS LiveShare的使用教程 文章简介下载过程 文章简介 本篇文章主要介绍了如何安装和使用LiveShare的过程。 下载过程 1.在扩展->管理扩展&#xff0c;搜索Live Share后&#xff0c;下载对应的安装包&#xff0c;安装后对VS进行重启 2.安装后界面右上角会出现Live Share标…

酷克数据出席永洪科技用户大会 携手驱动商业智能升级

10月27日&#xff0c;第7届永洪科技全国用户大会在北京召开。酷克数据作为国内云原生数仓代表企业&#xff0c;受邀出席本次大会&#xff0c;全面展示了云数仓领域最新前沿技术&#xff0c;并进行主题演讲。 携手合作 助力企业释放数据价值 数据仓库是商业智能&#xff08;BI…

什么是接口自动化测试?接口自动化测试的目的是什么?

1、什么是接口测试 接口测试是对系统或组件之间的接口的测试。主要用于检测外部系统与系统间以及内部各个子系统间的交互点。测试重点是检查数据交换、传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2、接口测试的目的 1> 尽早介入软件测试流程&#…

ubuntu(18.04) 安装 blast 并在php中调用

1、下载 https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/LATEST/2、解压&#xff0c;配置环境变量 tar zvxf ncbi-blast-2.14.1-x64-linux.tar.gz解压后改名为 blast 配置环境变量&#xff0c;可以不配置 使用的时候直接绝对路径使用&#xff08;本次使用绝对路径&am…

我用好说 AI 做二次元人设

你有没有想过自己做一部原创作品&#xff1f; 就像开发《星露谷物语》那样&#xff0c;自己把控作品的 角色、故事、载体、宣传 等方方面面&#xff0c;让 idea 不再只是灵光一闪。 以前是 “万事开头难”&#xff0c;可能第一步都举步维艰。但现在有了 AI 就不同了&#xff…

iOS 系统获取 Bundle ID、平台公钥、签名 MD5 值的指引

1. 获取 Bundle ID&#xff1a;使用 APP 对应的 IOS 开发者账号登录 Developer 控制台&#xff0c;找到下图标识符&#xff08;英文&#xff09;&#xff0c;单击进入 Certificates,Identifiers&Profiles 页面。 2. 在 Certificates,Identifiers&Profiles 页面&#xf…

Playwright已经是目前最好的测试自动化工具了吗?

作者观点&#xff1a;很长时间以来&#xff0c;Selenium是QA工程师寻求测试自动化解决方案的首选测试框架。它能够测试任何浏览器&#xff08;这在IE浏览器的统治时期尤其重要&#xff09;和任何平台。然而&#xff0c;现在看来&#xff0c;那个时代已经过去了。 今天&#xf…

Origin科研绘图与学术图表绘制从入门到精通

目录 前言 1. PDF基线的绘制 2. XRD图的绘制 3. 点线图的绘制 4. 如何快速掌握Orign 前言 Hello小伙伴好&#xff0c;最近在忙于三篇小论文&#xff0c;在大量的处理数据和画图中。对于一篇好的学术论文图是不可缺少的&#xff0c;可以说如果你的数据平平无奇&#xff…

【JavaEE初阶】 认识文件与Java中操作文件

文章目录 &#x1f334;认识文件&#x1f6a9;树型结构组织和目录&#x1f6a9;文件路径&#xff08;Path&#xff09;&#x1f6a9;知识扩展 &#x1f38d;Java 中操作文件&#x1f6a9;File 概述&#x1f4cc;属性&#x1f4cc;构造方法&#x1f4cc;方法 &#x1f6a9;File使…

LIS检验科信息管理系统源码 标本核收、采集检验结果、书写检验报告、质量控制

LIS检验科信息管理系统源码 LIS是采用软件解决数据接收方式的医疗系统之一&#xff0c;强化了病人从开检验单检验&#xff0c;到最后检验报告的各项步骤&#xff0c;更替代了以前的缓慢、不可靠的纯手工数据接收方式&#xff0c;使得医疗检验的步骤更有条理、效率更高、检验结果…

一致性哈希揭秘,深入解析其工作原理

前言 在进行一致性哈希介绍前&#xff0c;先思考2个问题&#xff1a; 什么是Hash一致性Hash和Hash的关系是什么 对于第一个问题Hash的定义 Hash也成散列&#xff0c;基本原理就是把任意长度的输入&#xff0c;通过hash算法变成固定长度的输出。 对于第二个问题&#xff0c…

关于 MapboxGL 在 Vue 中的简单使用

前言问题 关于我为什么使用了 在线的 js引入方法&#xff0c;而不是使用 npm 直接下载依赖问题&#xff0c;之前有一篇文章讲过原因&#xff1a;关于 Vue-iClient-MapboxGL 的使用注意事项 网上提供的 vue-iclient-mapboxgl 比较多&#xff0c;但是我这里使用的是 iclient-su…