golang中的类型转换那些事

由于golang是一门强类型的语言, 所以我们在golang的开发中不可避免的会对一些数据类型进行手动转换,以适应我们的业务需求。 

golang中类型转换的途径大致有4种,强制转换,类型断言,类型匹配 还有使用strconv包中提供的转换函数, 下面我们分别举例说明。

1. 强制转换   类型(变量名)

强制类型转换一般用于对已知类型(非any类型)进行高低精度之间的转换,如从 int 转换为 int64, 或者 int转换为 uint ,  float32转换为 float64 这类的转换, 这类型的转换较为简单,

  • 转换语法类型(变量名)   
  • 语法说明:这里的类型即是你要转换到的类型,变量名是你要转换的变量名称
  • 强制转换示例
var  x1 int = 10 // 声明一个int类型变量 x1 并赋值为 10

x2 := uint64(x1) // 将x1强制转换为uint64类型并赋值给x2
  • 细节说明:
  1.  从高精度到低精度转换会有丢失精度的风险;
  2. 对于any类型(即空接口类型interface{})的数据不能使用强制转换。

2. 类型断言   i变量名.(类型)

类型断言一个专门用于any类型(也就是 interface{}空接口类型,他们是一个东西)的数据类型转换的。 

语法:  i变量名.(类型

说明: 这里的 i变量名 指的就是你自己定义的interface{} 类型的变量名,注意必须是空接口类型,其他类型的变量名不能应用类型断言!!

这里的 类型   则可以是任意的类型,包括内置类型,和你自己定义的结构体或者接口都可以继续断言。 当然 any 也可以作为这里的类型进行断言的

类型断言示例:


func ExampleTypeAsserts() {

	var ival1 interface{} = 1
	// 对变量 ival1 进行 int数据类型断言, 断言后可返回2个值, 第二个值表示是否断言成功, 第一个是断言成功后的断言类型的值
	if int1, ok := ival1.(int); ok {
		fmt.Printf("%v 的类型是: %T \n", int1, int1) // output: 1 的类型是: int
	}
	// 如果你确定这个类型就是某个类型,断言也可以只用一个变量接收, 这种情况下,如果断言失败,则会抛panic异常,所以这种方式要慎用!
	// int2 := ival1.(int64) // 这个就会抛异常 panic: interface conversion: interface {} is int, not int64
	int2 := ival1.(int) // ok

	fmt.Printf("%v 的类型是: %T \n", int2, int2) // output: 1 的类型是: int


	// any 类型是interface{} 的一个别名 他们是一个东西
	var tsx any
	tsx = time.Now()
	// 对象断言
	if ts,ok:=tsx.(time.Time);ok {
		// 这里ts就是断言成功后的time类型的对象, 我们就可以调用他的方法 ts.Format(time.RFC3339)
		// 但是tsx 里面是不能直接调用time方法的, 虽然你知道你赋值了一个时间对象给他,这点一定要注意!!
		fmt.Printf("ts的类型为 %T , 值为: %v", ts, ts.Format(time.RFC3339)) // output: a
	}

}

3. 类型匹配  i变量名.(type)

这个也是专门用于处理any类型的数据的, 需要注意的是 i变量名.(type) 只能用在 switch语句上面。 他用于对any类型的数据进行类型匹配和处理。 如我们需要对不同类型的变量进行不同的处理时就用它。

语法:  switch  i变量名.(type) {  case xxx:   }

说明: i变量名 这个和上面的一样; .(type)  这时固定的用法,用于获取i变量名对应的类型; 后面的case语句就是 定义不同类型时的处理逻辑的,case 后面的 xxx 这个是你要判断的 类型,这里可以是任意的类型,包括内置类型或者你自己定义的类型或者接口

示例:


func ExampleTypeType() {
	var inter1 interface{}
	inter1 = 88.8 // 我们给这个变量 赋值一个float64类型的数, go里面对于否点数默认为 float64类型
	switch inter1.(type) {
	case int:
		fmt.Printf("inter1: %v 是int类型的数据", inter1) // 这个不会被执行
	case float64:
		fmt.Printf("inter1: %v 是float64类型的数据", inter1) // output: inter1: 88.8 是float64类型的数据
	case time.Time:
		fmt.Printf("inter1: %v 是time.Time类型的数据", inter1) // 这个也不会被执行
		
	}

}

4.strconv提供的转换函数

这个官方提供的包里面包含了非常多的转换函数,其中较为常用的是ParseXXX, FormatXXX 和 Atoi, 和 Itoa, 他们的使用相对比较简单,看看函数定义就可以使用。

strconv.Atoi("123") // 将字符串转换为int

strconv.Itoa(456) //将int转换为字符串

下面是strconv中所定义的函数一览表

func AppendBool(dst []byte, b bool) []byte
func AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int) []byte
func AppendInt(dst []byte, i int64, base int) []byte
func AppendQuote(dst []byte, s string) []byte
func AppendQuoteRune(dst []byte, r rune) []byte
func AppendQuoteRuneToASCII(dst []byte, r rune) []byte
func AppendQuoteRuneToGraphic(dst []byte, r rune) []byte
func AppendQuoteToASCII(dst []byte, s string) []byte
func AppendQuoteToGraphic(dst []byte, s string) []byte
func AppendUint(dst []byte, i uint64, base int) []byte
func Atoi(s string) (int, error)
func CanBackquote(s string) bool
func FormatBool(b bool) string
func FormatComplex(c complex128, fmt byte, prec, bitSize int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func IsGraphic(r rune) bool
func IsPrint(r rune) bool
func Itoa(i int) string
func ParseBool(str string) (bool, error)
func ParseComplex(s string, bitSize int) (complex128, error)
func ParseFloat(s string, bitSize int) (float64, error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)
func Quote(s string) string
func QuoteRune(r rune) string
func QuoteRuneToASCII(r rune) string
func QuoteRuneToGraphic(r rune) string
func QuoteToASCII(s string) string
func QuoteToGraphic(s string) string
func QuotedPrefix(s string) (string, error)
func Unquote(s string) (string, error)
func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)
type NumError
func (e *NumError) Error() string
func (e *NumError) Unwrap() error

总结:go语言中的类型转换和我们常用的java, rust, c, php等语言的类型转换可谓是完全不一样,他使用了自己独有的语法模式。对于新手而言前面3种模式很容易搞混淆,需要特别注意。 另外在进行类型断言时 对于断言后的结果他是可以有2个接收参数,也可以只有一个接收参数!搞清楚他们的区别很重要,这点需要特别注意。至于strconv包里面提供的函数的使用就太简单了,大家自己看看函数原型就能用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公网IP变更自动微信通知与远程执行命令的C++开源软件

基本功能 智能公网IP变更监测与微信通知 一旦检测到公网IP地址发生变更,系统将自动通过预设的QQ邮箱(该邮箱与微信绑定,实现微信通知)发送新IP地址通知。同时,软件会即时更新本地配置文件中的IP地址及变更时间&#…

vscode插件的开发过程记录(一)

前言 本文是关于visual studio code软件上自定义插件的开发记录,将从头记录本人开发的过程,虽然网上也有很多文章,但个人在实践的过程还是会遇到不一样的问题,所以记录下来,以便于后期参考。 前期准备: 1、…

Xilinx FPGA:vivado实现乒乓缓存

一、项目要求 1、用两个伪双端口的RAM实现缓存 2、先写buffer1,再写buffer2 ,在读buffer1的同时写buffer2,在读buffer2的同时写buffer1。 3、写端口50M时钟,写入16个8bit 的数据,读出时钟25M,读出8个16…

William Yang:从区块链先锋到艺术平台创始人

在区块链技术和加密货币市场飞速发展的今天,William Yang无疑是这一领域的佼佼者。他不仅在学术和媒体领域取得了显著成就,更在创业之路上不断探索,成为了业内知名的KOL(关键意见领袖)。今天,我们有幸采访到…

视频监控汇聚和融合平台的特点、功能、接入方式、应用场景

目录 一、产品概述 二、主要特点 1、多协议支持 2、高度集成与兼容性 3、高性能与可扩展性 4、智能化分析 5、安全可靠 三、功能概述 1. 视频接入与汇聚 2. 视频存储与回放 3. 实时监控与预警 4. 信息共享与联动 5. 远程管理与控制 四、接入方式 1、直接接入 2…

使用CubeIDE调试项目现stm32 no source available for “main() at 0x800337c:

使用CubeIDE调试项目现stm32 no source available for "main() at 0x800337c: 问题描述 使用CubeIDE编译工程代码和下载都没有任何问题,点击Debug调试工程时,出现stm32 no source available for "main() at 0x800337c 原因分析&a…

[leetcode hot 150]第四百五十二题,用最少数量的箭引爆气球

题目: 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

快速入门FreeRTOS心得(正点原子学习版)

对于FreeROTS,我第一反应想到的就是通信里的TDM(时分多址)。不同任务给予分配不同的时间间隔,也就是任务之间在每个timeslot都在来回切换。 这里有重要的一点,就是中断要短小,优先级是自高到底进行打断。 …

204.贪心算法:分发饼干(力扣)

以下来源于代码随想录 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 对孩子的胃口进行排序sort(g.begin(), g.end());// 对饼干的尺寸进行排序sort(s.begin(), s.end());int index s.size() - 1; // 从最大的饼…

大数据招商的应用场景及实施路径有哪些?

当下&#xff0c;我国已经进入数字经济与实体经济融合发展的新阶段&#xff0c;数字技术和数字化转型落地日臻成熟&#xff0c;数据要素价值释放深入到了我国各个领域的发展&#xff0c;招商引资也不例外&#xff0c;在传统招商模式效果日渐甚微的大环境下&#xff0c;大数据招…

面试题 4:阐述以下方法 @classmethod, @staticmethod, @property?

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

数据大小端问题

文章目录 大小端前言函数引用(接下来使用此函数对高低位进行切换)先看截取的对于大小端的定义大小端数据的直观理解[重点] 对uchar数组进行取操作定义一个uint8_t的数组观察起内部内存尝试使用uint32_t 每次区 1、2、3、4byte数据 提升经过上面的介绍一定对大小端有了一定的了解…

2.3 主程序和外部IO交互 (文件映射方式)----IO Server实现

2.3 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Server C实现 效果显示 1 内存共享概念 基本原理&#xff1a;以页面为单位&#xff0c;将一个普通文件映射到内存中&#xff0c;达到共享内存和节约内存的目的&#xff0c;通常在需要对文件进行频繁读写时…

基于OpenMV识别数字及程序说明

OpenMV简介 OpenMV是一个开源、低成本且功能强大的机器视觉模块。它基于STM32F427CPU&#xff0c;集成了OV7725摄像头芯片&#xff0c;能在小巧的硬件模块上&#xff0c;用C语言高效地实现核心机器视觉算法&#xff0c;并提供了Python编程接口&#xff0c;使得图像处理的复杂度…

【教程】lighttpd配置端口反向代理

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、修改配置文件&#xff1a; sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy&#xff1a; 3、然后添加端口映射&#xff1a; 4、保存&…

2024年07年01日 Redis数据类型以及使用场景

String Hash List Set Sorted Set String&#xff0c;用的最多&#xff0c;对象序列化成json然后存储 1.对象缓存&#xff0c;单值缓存 2.分布式锁 Hash&#xff0c;不怎么用到 1.可缓存经常需要修改值的对象&#xff0c;可单独对对象某个属性进行修改 HMSET user {userI…

Transformation(转换)开发-switch/case组件

一、switch/case组件-条件判断 体育老师要做一件非常重要的事情&#xff1a;判断学生是男孩还是女孩、或者是蜘蛛&#xff0c;然后让他们各自到指定的队伍中 体育老师做的事情&#xff0c;我们同样也会在Kettle中会经常用来。在Kettle中&#xff0c;switch/case组件可以来做类似…

河南特岗教师报名流程及免冠照片电子版制作要求

2024年河南特岗教师招聘季又来啦&#xff01;想要成为孩子们心中的超级英雄吗&#xff1f;想要在教育的田野上播种希望吗&#xff1f;那就不要错过这次机会&#xff0c;今年全省共招聘特岗教师3495名&#xff08;具体岗位设置参见《河南省2024年特岗教师招聘岗位设置》&#xf…

盒子模型(笔记)

盒子模型 盒子模型的属性 padding属性 内边距&#xff1a;盒子的边框到内容的距离 /*每个方向内边距*/padding-top: 20px;padding-left:20px;padding-bottom:20px;padding-right: 20px; /*每个方向内边距的第二种方法*/ /* 顺序依次是上左右下*/padding: 10px 20px 30px 4…

02:vim的使用和权限管控

vim的使用 1、vim基础使用1.1、vim pathname 2、vim高级用法2.1、查找2.2、设置显示行号2.3、快速切换行2.4、 行删除2.5、行复制粘贴 3、权限管理3.1、普通用户和特权用户3.2、文件权限表示 vim是Linux中的一种编辑器&#xff0c;类似于window中的记事本&#xff0c;可以对创建…