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 环境 …...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...