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)
}

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

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

相关文章

如何提升自己?

来自鱼皮大佬&#xff1a;链接 1、每日阅读 每日读2-3篇文章&#xff0c;包括行业趋势、技术干货、经验分享、思维提升 大厂的技术博客&#xff1a;比如美团技术团队、阿里技术团队科技资讯类&#xff1a;量子位、差评、新智元、无敌信息差经验分享、编程趋势、技术干货&…

SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

微服务注册中心 注册中心可以说是微服务架构中的”通讯录“&#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c;服务会注册到这里&#xff0c;当服务需要调用其它服务时&#xff0c;就这里找到服务的地址&#xff0c;进行调用。 微服务注册中心 服务注…

OpenGL_Learn13(材质)

1. 材质 cube.vs #version 330 core layout (location 0) in vec3 aPos; layout (location 0 ) in vec3 aNormal;out vec3 FragPos; out vec3 Normal;uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {FragPosvec3(model*vec4(aPos,1.0));Norma…

17. Spring类型转换之PropertyEditor

简介 我们之所以使用spring如此的简单&#xff0c;并且功能比较强大&#xff0c;比较人性化&#xff0c;是因为很多重复且繁琐的以及能想到的可以简化业务的功能都给我们默认提供了&#xff0c;类型转化就是典型的例子 spring提供了两种类型转化的方式&#xff0c;一种是spri…

从零开始:Rust环境搭建指南

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起探讨如何从零开始搭建Rust开发环境。 Rust环境搭建概览 Rust是一种系统编程语言&#xff0c;以其安全性、并发性和性能闻名。搭建Rust环境是学习和使用这一语言的第一步。 第一步&#xff1a;安装Rust Rust的…

3-docker安装centos7

CentOS7.9下安装完成docker后&#xff0c;后续我们可以在其上安装centos7系统。具体操作如下&#xff1a; 1.以root用户登录CentOS7.9服务器&#xff0c;拉取centos7 images 命令&#xff1a; docker pull centos:centos7 2.加载centos7 images并登录验证 命令&#xff1a;…

Activiti7工作流

文章目录 一、工作流介绍1.1 概念1.2 适用行业1.3 应用领域1.4 传统实现方式1.5 什么是工作流引擎 二、什么是Activiti7&#xff1f;2.1 概述2.2 Activiti7内部核心机制2.3 BPMN2.4 Activiti如何使用2.4.1 整合Activiti2.4.2 业务流程建模2.4.3 部署业务流程2.4.4 启动流程实例…

python语法之变量名

变量可以有一个简短的名称(如x和y)&#xff0c;也可以有一个更具描述性的名称(如age、carname、total_volume)。Python变量规则: 变量名必须以字母或下划线开头变量名不能以数字开头变量名只能包含字母数字字符和下划线(A-z、0-9和_)。变量名区分大小写(age、age和age是三个不…

WPF中行为与触发器的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 一、行为 (Behaviors) behaviors的简单测试 <Window x:Class"Test_05.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

DevToys:开发者的多功能瑞士军刀,让编程更高效!

DevToys&#xff1a;开发者的多功能瑞士军刀&#xff0c;让编程更高效&#xff01; DevToys 是一款专为开发者设计的实用工具&#xff0c;它能够帮助用户完成日常的开发任务&#xff0c;如格式化 JSON、比较文本和测试正则表达式&#xff08;RegExp&#xff09;。它的优势在于…

Selenium UI 自动化

一、Selenium 自动化 1、什么是Selenium&#xff1f; Selenium是web应用中基于UI的自动化测试框架。 2、Selenium的特点&#xff1f; 支持多平台、多浏览器、多语言。 3、自动化工作原理&#xff1f; 通过上图&#xff0c;我们可以注意到3个角色&#xff0c;下面具体讲解一…

VBA之Word应用:文档(Document)的书签

《VBA之Word应用》&#xff08;版权10178982&#xff09;&#xff0c;是我推出第八套教程&#xff0c;教程是专门讲解VBA在Word中的应用&#xff0c;围绕“面向对象编程”讲解&#xff0c;首先让大家认识Word中VBA的对象&#xff0c;以及对象的属性、方法&#xff0c;然后通过实…

大数据数仓建模基础理论【维度表、事实表、数仓分层及示例】

文章目录 什么是数仓仓库建模&#xff1f;ER 模型三范式 维度建模事实表事实表类型 维度表维度表类型 数仓分层ODS 源数据层ODS 层表示例 DWD 明细数据层DWD 层表示例 DIM 公共维度层DIM 层表示例 DWS 数据汇总层DWS 层表数据 ADS 数据应用层ADS 层接口示例 数仓分层的优势 什么…

数据结构之链表练习与习题详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.习题解…

CICD 持续集成与持续交付——git

git使用 [rootcicd1 ~]# yum install -y git[rootcicd1 ~]# mkdir demo[rootcicd1 ~]# cd demo/ 初始化版本库 [rootcicd1 demo]# git init 查看状态 [rootcicd1 demo]# git status[rootcicd1 demo]# git status -s #简化输出 [rootcicd1 demo]# echo test > README.md[roo…

python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)

省流建议 本文针对以下需求&#xff1a; 想自动化标注一些目标不再想使用yolo想在目标检测/语意分割有所建树计算机视觉项目想玩一玩大模型了解自动化工具了解最前沿模型自定义目标P图替换… 确定好需求&#xff0c;那么我们发车&#xff01; 实现功能与结果 该模型将首先…

Python中的迭代器、生成器和装饰器

当谈到Python中的迭代器、生成器和装饰器时&#xff0c;这三个概念都是与函数和数据处理密切相关的。让我们逐个深入了解它们。 1. 迭代器&#xff08;Iterators&#xff09;&#xff1a; 迭代器是一个可以逐个访问元素的对象。在Python中&#xff0c;迭代器实现了两个方法&a…

6 Redis的慢查询配置原理

1、redis的命令执行流程 redis的慢查询只针对步骤3 默认情况下&#xff0c;慢查询的阈值是10ms

基于PHP+MySql的酒店信息管理系统的设计与实现

一、系统开发环境 运行环境&#xff1a;phpstudy或者wampserver&#xff0c; 开发工具&#xff1a;vscodephpstorm 数据库&#xff1a;mysql 二、酒店管理系统功能 1.前台功能&#xff1a; 首页客房推荐&#xff0c;周边特色介绍 酒店在线预订 订单查询&#xff0c;可以…

C++各种字符转换

C各种字符转换 一.如何将char数组转化为string类型二. string转char数组&#xff1a;参考 一.如何将char数组转化为string类型 在C中&#xff0c;可以使用string的构造函数或者赋值操作符来将char数组转换为string类型。 方法1&#xff1a;使用string的构造函数 const char* c…