14 Go的类型转换
概述
在上一节的内容中,我们介绍了Go的错误处理,包括:errors包、返回错误、抛出异常、捕获异常等。在本节中,我们将介绍Go的类型转换。在Go语言中,类型转换是一种将一个值从一种类型转换为另一种类型的过程。类型转换主要有4种,分别为:断言类型转换、显式类型转换、隐式类型转换、强制类型转换。下面将分别进行介绍。
断言类型转换
在Go语言中,断言是一种类型转换,它可以将一个接口类型的值转换为具体的类型。断言在Go语言中通常用于类型检查和类型转换,其语法如下:
value, ok := interfaceValue.(Type)
其中,interfaceValue是一个接口类型的值,Type是要转换的具体类型。断言将接口值转换为具体类型,并将转换后的值赋给value变量。同时,还返回一个布尔值ok,指示转换是否成功。注意:断言只能用于接口类型的值转换为具体类型,如果尝试将一个非接口类型的值进行断言,将会导致编译错误。
在下面的示例代码中,我们定义了一个接口类型的变量data,并将其赋值为66。然后,我们使用断言将data转换为int类型,并将转换后的值赋给value变量。如果转换成功,打印出转换后的值;否则,打印出转换失败的消息。接下来,我们尝试将data转换为string类型,并进行了类似的处理。
package mainimport "fmt"func main() { var data interface{} = 66// 断言将接口值转换为int类型,输出:Convert to int success: 66value, ok := data.(int)if ok {fmt.Println("Convert to int success:", value)} else {fmt.Println("Convert to int failed")}// 断言将接口值转换为string类型,输出:Convert to string failedvalue2, ok2 := data.(string)if ok2 {fmt.Println("Convert to string success:", value2)} else {fmt.Println("Convert to string failed")}
}
另外,我们还可以使用switch语句结合断言进行类型转换。通过将接口类型的值与特定类型的值进行比较,可以实现类型转换。具体如何使用,可参考下面的示例代码。
package mainimport "fmt"func main() { var data interface{} = "Hello, CSDN"// 断言switch,输出:Convert to string: Hello, CSDNswitch value := data.(type) {case int:fmt.Println("Convert to int:", value)case string:fmt.Println("Convert to string:", value)default:fmt.Println("Convert failed")}
}
注意:使用断言进行类型转换时,如果断言失败,将会进入default分支。因此,在使用断言时,建议始终添加default分支以处理可能的错误情况。
显式类型转换
显式类型转换可以通过使用类型转换操作符将一个值转换为指定的类型,其语法如下:
type_name(expression)
其中,type_name为数据类型,expression为表达式或变量值。注意:类型转换可能会导致精度损失或溢出。因此,在进行类型转换时,需要确保目标类型能够容纳原始值的范围,否则可能会产生不正确的结果。
在下面的示例代码中,我们将一个float64类型的值66.66显式地转换为int类型,并将结果赋给变量y。由于int类型无法容纳小数部分,故转换后的值为66。
package mainimport "fmt"func main() {var x float64 = 66.66// 将float64类型的变量显式转换为int类型var y int = int(x)// 输出: 66fmt.Println(y)
}
隐式类型转换
隐式类型转换是指在表达式中自动进行的类型转换,这种类型转换通常发生在不同类型的数据之间进行运算时。Go语言会自动将它们转换成相同的类型,以确保表达式的合法性和正确性。要真正理解隐式类型转换,需要先了解下常量。
常量是指不能改变值的特殊变量,分为两种:未命名常量和命名常量。未命名常量只在编译期间存在,不会存储在内存中。命名常量存在于内存静态区,不允许修改。比如:const a = 66这条语句,66是未命名常量,a是命名常量;编译后,a的值固定为66,而等号右边的66不再存在。
除位运算、未命名常量外,运算符两边的操作数类型必须相同,否则会发生编译错误。如果运算符两边是不同类型的未命名常量,则隐式转换的优先级为:整数(int) < 字符型(rune) < 浮点数(float) < 复数(Complex)。
package mainimport "fmt"func main() {// 66和100的类型相同,不需要隐式类型转换const num1 = 66 / 100// 整数优先转换为浮点数100.0, 结果为0.66const num2 = 66 / 100.0const num3 int = 88// num3为命名常量,与1.5的数据类型不同,无法进行隐式类型转换,会发生编译错误const num4 = num3 * 1.5fmt.Println(num1, num2, num3, num4)
}
另外,兼容的类型可以进行隐式类型转换,不兼容的类型不能够进行隐式类型转换,具体可参考下面的示例代码。
package mainimport "fmt"func main() {// 类型相同,不需要隐式类型转换const num1 int = 66// 66.0即为66,类型兼容,可进行隐式类型转换const num2 int = 66.0// 类型不兼容,不能进行隐式类型转换,会发生编译错误const num3 int = 66.1// 类型相同,不需要隐式类型转换const num4 float64 = 66.0// 66即为66.0,类型兼容,可进行隐式类型转换const num5 float64 = 66fmt.Println(num1, num2, num3, num4, num5)
}
强制类型转换
在Go语言中,可以进行强制类型转换来将一个值转换为指定的类型,其语法如下:
type_name(value)
其中,type_name是目标类型,value是要进行类型转换的值。
在下面的示例代码中,我们将浮点数a的值强制转换为int类型,并将结果赋值给变量b。注意:在进行强制类型转换时,可能会出现精度丢失或溢出等问题。因此,在进行强制类型转换时,需要小心处理可能出现的异常情况。
package mainimport "fmt"func main() {var a float64 = 3.14var b int = int(a)// 输出:3.14 3fmt.Println(a, b)
}
strconv包
strconv包是Go语言标准库中的一个包,它提供了字符串和基本数据类型之间的转换函数。这个包中的函数可以将字符串转换为不同的基本数据类型(比如:整数、浮点数等),也可以将基本数据类型转换为字符串。
以下是strconv包中一些常用的函数:
Atoi(s string) (int, error):将字符串s转换为对应的整数。如果转换失败,会返回一个错误值。
ParseInt(s string, base int, bitSize int) (int, error):将字符串s转换为对应的整数,并指定进制base和位数 bitSize。如果转换失败,会返回一个错误值。
ParseFloat(s string, bitSize int) (float64, error):将字符串s转换为对应的浮点数,并指定位数bitSize。如果转换失败,会返回一个错误值。
FormatInt(v int64, base int) string:将整数v转换为指定进制的字符串表示。
FormatFloat(v float64, fmt byte, prec, bitSize int) string:将浮点数v转换为字符串表示,并指定格式化选项 fmt、精度prec和位数bitSize。第二个参数fmt是格式化选项,'f'表示使用普通的浮点数格式。第三个参数prec是精度,-1表示使用尽可能多的精度。第四个参数bitSize是浮点数的位数,64位浮点数为float64。
关于这些函数具体如何使用,可以参考下面的示例代码。
package mainimport "fmt"
import "strconv"func main() {// 将字符串转换为整数,输出:66num, err := strconv.Atoi("66")if err != nil {fmt.Println("Failed:", err)} else {fmt.Println(num)}// 将字符串转换为浮点数,输出:3.14fnum, err := strconv.ParseFloat("3.14", 64)if err != nil {fmt.Println("Failed:", err)} else {fmt.Println(fnum)}// 将整数转换为字符串,输出:99str := strconv.Itoa(99)fmt.Println(str)// 将浮点数转换为字符串,输出:2.718str = strconv.FormatFloat(2.71828, 'f', 3, 64)fmt.Println(str)
}
相关文章:
14 Go的类型转换
概述 在上一节的内容中,我们介绍了Go的错误处理,包括:errors包、返回错误、抛出异常、捕获异常等。在本节中,我们将介绍Go的类型转换。在Go语言中,类型转换是一种将一个值从一种类型转换为另一种类型的过程。类型转换主…...
多线程概述
文章目录 线程是什么线程有什么作用线程和进程的区别多线程相较于进程优势 在Java这个圈子中,多进程用的并不多,因为进程是一个重量级操作,进程是资源分配的基本单位,申请资源是一个比较消耗时间的操作. 线程是什么 线程是一个独立的执行流,可以被独立调度到CPU上执行 线程是…...
AR贴纸特效SDK,无缝贴合的虚拟体验
增强现实(AR)技术已经成为了企业和个人开发者的新宠。它通过将虚拟元素与现实世界相结合,为用户提供了一种全新的交互体验。然而,如何将AR贴纸完美贴合在人脸的面部,同时支持多张人脸的检测和标点及特效添加࿰…...
Leetcode hot 100
双指针 283.移动零 class Solution { public:void moveZeroes(vector<int>& nums) {int cnt 0;for(vector<int>::iterator it nums.begin(); it ! nums.end(); ){if(*it 0) it nums.erase(it),cnt;else it;}while(cnt--){nums.push_back(0);}} }; 11.盛…...
分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测
分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测 目录 分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测(完整源码和数据) 2.多…...
矩阵运算_矩阵的协方差矩阵/两个矩阵的协方差矩阵_求解详细步骤示例
1. 协方差矩阵定义 在统计学中,方差是用来度量单个随机变量的离散程度,而协方差则一般用来刻画两个随机变量的相似程度。 参考: 带你了解什么是Covariance Matrix协方差矩阵 - 知乎 2. 协方差矩阵计算过程 将输入数据A进行中心化处理得到A…...
100天精通Python(可视化篇)——第108天:Pyecharts绘制多种炫酷词云图参数说明+代码实战
文章目录 专栏导读一、词云图介绍1. 词云图是什么?2. 词云图应用场景?二、参数说明1. 导包2. add函数三、词云库实战1. 基础词云图2. 矩形词云图3. 三角形词云图4. 菱形词云图5. 自定义图片词云图书籍推荐专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本…...
Spark 平障录
Profile Profile 是最重要的第一环。 利用好 spark UI 和 yarn container log分析业务代码,对其计算代价进行预判建设基准,进行对比,比如application id 进行对比,精确到 job DAG 环节 充分利用 UI Stage 页面 页头 summary&…...
基于一致性算法的微电网分布式控制MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿,实现功率均分,保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类:协调同…...
Android 10.0 系统修改usb连接电脑mtp和PTP的显示名称
1.前言 在10.0的产品定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的 方法来解决这个问题 2.系统修改usb连…...
飞鼠异地组网工具实战之访问k8s集群内部服务
飞鼠异地组网工具实战之访问k8s集群内部服务 一、飞鼠异地组网工具介绍1.1 飞鼠工具简介1.2 飞鼠工具官网 二、本次实践介绍2.1 本次实践场景描述2.2 本次实践前提2.3 本次实践环境规划 三、检查本地k8s集群环境3.1 检查k8s各节点状态3.2 检查k8s版本3.3 检查k8s系统pod状态 四…...
【Flink】窗口(Window)
窗口理解 窗口(Window)是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中,再对每个“桶”加以处理。 本文的重心将放在 Flink 如何进行窗口操作以及开发者如何尽可能地利用 Flink 所提供的功能。 对窗口的正确理解ÿ…...
读像火箭科学家一样思考笔记03_第一性原理(上)
1. 思维的两种障碍 1.1. 为什么知识会成为一种缺陷而非一种美德 1.1.1. 知识是一种美德 1.1.2. 知识同样的特质也会把它变成一种缺点 1.1.3. 知识确实是个好东西,但知识的作用应该是给人们提供信息,而不是起约束作用 1.1.4. 知识应该启发智慧&#…...
npm私有云
安装node时npm会自动安装,npm也可以单独安装。 package.json 在使用npm时,package.json文件是非常重要的,因为它包含了关于项目的必要信息,比如名称、版本、依赖项等。在初始化新项目时,通常会使用npm init命令生成一…...
莹莹API管理系统源码附带两套模板
这是一个API后台管理系统的源码,可以自定义添加接口,并自带两个模板。 环境要求 PHP版本要求高于5.6且低于8.0,已测试通过的版本为7.4。 需要安装PHPSG11加密扩展。 已测试:宝塔/主机亲测成功搭建! 安装说明 &am…...
【Kingbase FlySync】命令模式:安装部署同步软件,实现KES到KES实现同步
【Kingbase FlySync】命令模式:安装部署同步软件,实现KES到KES实现同步迁移 概述准备环境目标资源1.测试虚拟机下载地址包含node1,node22.同步工具下载地址3.临时授权下载地址4.ruby工具下载地址5.EXAMv0.11.sql下载地址 实操:同步软件安装部署1.node1准…...
python使用selenium webDriver时 报错
可能原因和解决: 1. python 解释器 ----> 设置 2. 浏览器版本 与 浏览器驱动版本不一致 ----> 安装同一版本的 (下载chromedriver | 谷歌驱动更高版本的测试版) 参考:Python使用Selenium WebDriver的入门介绍及安装教程-CSDN博客 Selenium安…...
【ROS2机器人入门到实战】
ROS2机器人入门到实战教程(鱼香ROS) 写在前面 当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版| 四驱版为方便交流,搭建了机器人技术问…...
Nuxt3框架局部文件引用外部JS/CSS文件的相关配置方法
引入外部JS: <script setup>useHead({script: [ {type: "text/javascript",src: https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js}]}) </script>useHead只能与组件的setup和生命周期钩子一起使用 如果需要将js放置body区…...
Docker 可视化面板 ——Portainer
Portainer 是一个非常好用的 Docker 可视化面板,可以让你轻松地管理你的 Docker 容器。 官网:Portainer: Container Management Software for Kubernetes and Docker 【Docker系列】超级好用的Docker可视化工具——Portainer_哔哩哔哩_bilibili 环境 …...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
