当前位置: 首页 > news >正文

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的类型转换

概述 在上一节的内容中&#xff0c;我们介绍了Go的错误处理&#xff0c;包括&#xff1a;errors包、返回错误、抛出异常、捕获异常等。在本节中&#xff0c;我们将介绍Go的类型转换。在Go语言中&#xff0c;类型转换是一种将一个值从一种类型转换为另一种类型的过程。类型转换主…...

多线程概述

文章目录 线程是什么线程有什么作用线程和进程的区别多线程相较于进程优势 在Java这个圈子中,多进程用的并不多,因为进程是一个重量级操作,进程是资源分配的基本单位,申请资源是一个比较消耗时间的操作. 线程是什么 线程是一个独立的执行流,可以被独立调度到CPU上执行 线程是…...

AR贴纸特效SDK,无缝贴合的虚拟体验

增强现实&#xff08;AR&#xff09;技术已经成为了企业和个人开发者的新宠。它通过将虚拟元素与现实世界相结合&#xff0c;为用户提供了一种全新的交互体验。然而&#xff0c;如何将AR贴纸完美贴合在人脸的面部&#xff0c;同时支持多张人脸的检测和标点及特效添加&#xff0…...

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堆叠去噪自编码器的数据分类预测&#xff08;完整源码和数据) 2.多…...

矩阵运算_矩阵的协方差矩阵/两个矩阵的协方差矩阵_求解详细步骤示例

1. 协方差矩阵定义 在统计学中&#xff0c;方差是用来度量单个随机变量的离散程度&#xff0c;而协方差则一般用来刻画两个随机变量的相似程度。 参考&#xff1a; 带你了解什么是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分析业务代码&#xff0c;对其计算代价进行预判建设基准&#xff0c;进行对比&#xff0c;比如application id 进行对比&#xff0c;精确到 job DAG 环节 充分利用 UI Stage 页面 页头 summary&…...

基于一致性算法的微电网分布式控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿&#xff0c;实现功率均分&#xff0c;保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类&#xff1a;协调同…...

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)

窗口理解 窗口&#xff08;Window&#xff09;是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中&#xff0c;再对每个“桶”加以处理。 本文的重心将放在 Flink 如何进行窗口操作以及开发者如何尽可能地利用 Flink 所提供的功能。 对窗口的正确理解&#xff…...

读像火箭科学家一样思考笔记03_第一性原理(上)

1. 思维的两种障碍 1.1. 为什么知识会成为一种缺陷而非一种美德 1.1.1. 知识是一种美德 1.1.2. 知识同样的特质也会把它变成一种缺点 1.1.3. 知识确实是个好东西&#xff0c;但知识的作用应该是给人们提供信息&#xff0c;而不是起约束作用 1.1.4. 知识应该启发智慧&#…...

npm私有云

安装node时npm会自动安装&#xff0c;npm也可以单独安装。 package.json 在使用npm时&#xff0c;package.json文件是非常重要的&#xff0c;因为它包含了关于项目的必要信息&#xff0c;比如名称、版本、依赖项等。在初始化新项目时&#xff0c;通常会使用npm init命令生成一…...

莹莹API管理系统源码附带两套模板

这是一个API后台管理系统的源码&#xff0c;可以自定义添加接口&#xff0c;并自带两个模板。 环境要求 PHP版本要求高于5.6且低于8.0&#xff0c;已测试通过的版本为7.4。 需要安装PHPSG11加密扩展。 已测试&#xff1a;宝塔/主机亲测成功搭建&#xff01; 安装说明 &am…...

【Kingbase FlySync】命令模式:安装部署同步软件,实现KES到KES实现同步

【Kingbase FlySync】命令模式:安装部署同步软件&#xff0c;实现KES到KES实现同步迁移 概述准备环境目标资源1.测试虚拟机下载地址包含node1,node22.同步工具下载地址3.临时授权下载地址4.ruby工具下载地址5.EXAMv0.11.sql下载地址 实操&#xff1a;同步软件安装部署1.node1准…...

python使用selenium webDriver时 报错

可能原因和解决&#xff1a; 1. python 解释器 ----> 设置 2. 浏览器版本 与 浏览器驱动版本不一致 ----> 安装同一版本的 (下载chromedriver | 谷歌驱动更高版本的测试版) 参考&#xff1a;Python使用Selenium WebDriver的入门介绍及安装教程-CSDN博客 Selenium安…...

【ROS2机器人入门到实战】

ROS2机器人入门到实战教程(鱼香ROS) 写在前面 当前平台文章汇总地址&#xff1a;ROS2机器人从入门到实战获取完整教程及配套资料代码&#xff0c;请关注公众号<鱼香ROS>获取教程配套机器人开发平台&#xff1a;两驱版| 四驱版为方便交流&#xff0c;搭建了机器人技术问…...

Nuxt3框架局部文件引用外部JS/CSS文件的相关配置方法

引入外部JS&#xff1a; <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 可视化面板&#xff0c;可以让你轻松地管理你的 Docker 容器。 官网&#xff1a;Portainer: Container Management Software for Kubernetes and Docker 【Docker系列】超级好用的Docker可视化工具——Portainer_哔哩哔哩_bilibili 环境 …...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们&#xff0c;有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL&#xff0c; 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始&#xff0c;OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...