golang中的类型转换那些事

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

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

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

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

  • 转换语法类型(变量名)   
  • 语法说明:这里的类型即是你要转换到的类型,变量名是你要转换的变量名称
  • 强制转换示例
var  x1 int = 10 // 声明一个int类型变量 x1 并赋值为 10x2 := 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 int64int2 := ival1.(int) // okfmt.Printf("%v 的类型是: %T \n", int2, int2) // output: 1 的类型是: int// any 类型是interface{} 的一个别名 他们是一个东西var tsx anytsx = 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.mzph.cn/diannao/41287.shtml

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

相关文章

[TensorFlow-Lite][深度学习]【快速简介-1】

前言: 很多场景下面我们需要需要把我们的深度学习模型部署到Android,IOS 手机上面. Google 通过TensorFlow Lite 提供了对应的解决方案. 目录: 端侧部署优点 硬件支持 性能 应用案例 一 端侧部署优点 1; 很多场景下面: 无网络,数据无法…

Hadoop 远程 debug

Hadoop 命令行 在执行 hadoop fs 命令行之前,先执行以下命令: export HADOOP_CLIENT_OPTS"-Xdebug -Xrunjdwp:transportdt_socket,servery,suspendy,address8000"

昇思25天学习打卡营第10天|基于MindSpore实现BERT对话情绪识别

基于MindSpore实现BERT对话情绪识别 模型简介数据集模型构建模型验证模型推理自定义推理数据集 模型简介 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发…

HTML超链接和锚链接

HTML超链接和锚链接 一、定义 HTML的超链接&#xff08;Hyperlink&#xff09;用于在网页之间创建链接&#xff0c;使用户可以点击这些链接来导航到其他页面或资源。 二、基本语法 1、语法 HTML中的超链接使用a标签来定义 <a href"URL">链接文本</a&g…

yolov8实战——yolov8TensorRT部署(python推理)(保姆教学)

yolov8实战——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教学&#xff09; 一 、准备好代码和环境安装TensorRt下载代码和安装环境 部署和推理构建ONNX构建engine无torch推理torch推理 最近用到yolov8&#xff0c;但是寻找了一圈才找到了yolov8最…

[SAP ABAP] 版本管理

版本管理是指软件开发过程中各种程序代码、配置文件以及说明文档等文件变更的管理 生成版本 版本管理 对比版本 点击上述版本管理即可进行版本对比操作 补充扩展 我们可以使用事务码SE10对传输请求进行创建、修改、删除、合并以及更改所有者等操作 使用事务码SCC1进行不同cl…

3D生成模型TripoSR完美搭建流程,包含所有问题解决方案!

最近需要使用3D生成模型,无意中看到了TripoSR,觉得效果还行,于是打算在Linux系统上部署一下,结果遇到很多坑,在这里写一下详细的部署流程和部署过程中遇到的问题。 下面是TripoSR的源码地址。 GitHub - VAST-AI-Research/TripoSRContribute to VAST-AI-Research/TripoSR…

java-Linkedlist源码分析

## 深入分析 Java 中的 LinkedList 源码 LinkedList 是 Java 集合框架中的一个重要类&#xff0c;它基于双向链表实现&#xff0c;提供了高效的插入和删除操作。与 ArrayList 不同&#xff0c;LinkedList 的结构使其在特定操作上有更优的性能表现。本文将详细分析 LinkedList …

android 进程,线程调度的区别

一 分析&#xff1a; 进程和线程在调度上有什么不同呢&#xff1f;当有一个task去占用指定的资源时候叫进程&#xff0c;当有多个task去共享使用这些资源时候&#xff0c;这个task和之后的task都叫线程&#xff08;最初这个task叫主线程&#xff09;而linux调度主要调的就是cp…

【Portswigger 学院】文件上传

教程和靶场来源于 Burpsuite 的官网 Portswigger&#xff1a;File upload vulnerabilities - PortSwigger 原理与危害 很多网站都有文件上传的功能&#xff0c;比如在个人信息页面允许用户上传图片作为头像。如果网站应用程序对用户上传的文件没有针对文件名、文件类型、文件内…

前端基础:JavaScript(篇一)

目录 JavaScript概述 JavaScript历史&#xff1a; 须知&#xff1a; 基本语法 变量 代码 运行 数据类型 1、数值型(number)&#xff1a; 代码 运行 2、布尔型(boolean)&#xff1a; 代码 运行 3、字符串型&#xff1a; 代码 运行 4、 undefined类型 代码…

TCP的pop网络模式

TCP的pop网络模式 1、tcp连接的状态有以下11种 CLOSED&#xff1a;关闭状态LISTEN&#xff1a;服务端状态&#xff0c;等待客户端发起连接请求SYN_SENT&#xff1a;客户端已发送同步连接请求&#xff0c;等待服务端相应SYN_RECEIVED&#xff1a;服务器收到客户端的SYN请请求&…

MySQL 基本语法讲解及示例(下)

第六节&#xff1a;如何检索资料 在本节中&#xff0c;我们将介绍如何使用SQL语句检索数据库中的资料&#xff0c;具体包括选择特定列、排序、条件过滤以及组合排序等操作。我们以一个名为student的表格为例&#xff0c;演示不同的检索方法。 初始表格 student student_idname…

修复harbor的/account/sign-in\?globalSearch=b不登录可以查询镜像的问题

Nginx的location指令不能直接匹配查询参数&#xff0c;所以需要通过其他方式来处理。这里是一个使用if指令结合查询参数来实现的方法。该方法会在请求路径中带有特定查询参数时返回404。 使用if指令匹配查询参数 打开Nginx配置文件&#xff1a; sudo vim /etc/nginx/sites-ava…

Python中frozenset,秒变不可变集合,再也不用担心多线程了!

目录 1、Frozenset基础介绍 🌐 1.1 Frozenset定义与创建 1.2 不可变集合特性 1.3 与Set的区别对比 2、Frozenset操作实践 🧩 2.1 初始化与添加元素尝试 2.2 成员测试: in & not in 2.3 集合运算: 并集、交集、差集 2.4 使用场景示例: 字典键、函数参数默认值 …

登录设计(实战项目)-1个手机号多用户身份登录

一. 背景&#xff1a; 该需求是一个互联网医院的预约单场景&#xff0c;护士在小程序上申请患者查房预约单&#xff0c;医生在小程序上对预约单进行接单&#xff0c;护士开始查房后填写查房小结&#xff0c;客户需要对用户信息进行授权&#xff0c;医生查房后进行签字&#xff…

劲爆!华为享界两款新车曝光,等等党有福了

文 | AUTO芯球 作者 | 雷慢 劲爆啊&#xff0c;北汽的一份环境影响分析报告&#xff0c; 不仅曝光了享界S9的生产进展&#xff0c; 还泄露了自家的另两款产品&#xff0c; 第一款是和享界S9同尺寸的旅行车&#xff0c; 我一看&#xff0c;这不是我最喜欢的“瓦罐”吗&…

v-html 空格/换行不生效

接口返回的内容如下&#xff1a;有空格有换行&#xff0c;但 使用v-html无效 需加css样式 white-space: pre-wrap; <div class"pretty-html" v-html"Value"></div>.pretty-html {white-space: pre-wrap; /* 保留空格和换行&#xff0c;并允许…

掌握麦肯锡精英的6个技巧,你也能成为1%的精英!

不知道大家有没有想过&#xff0c;我们和那些全球顶尖精英的差距可能只有1%&#xff0c;只是99%的人还不知道这件事。 今天给大家推荐一本好书&#xff0c;《你和麦肯锡精英的差别只有1%》。优思学院发现&#xff0c;在我们的六西格玛、精益管理的学生中很多人对自己没有自信。…

软通动力子公司鸿湖万联最新成果SwanLink AI亮相世界人工智能大会

7月4日&#xff0c;2024世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC 2024&#xff09;在上海拉开帷幕&#xff0c;软通动力董事长兼首席执行官刘天文受邀出席开幕式。其间&#xff0c;软通动力携子公司鸿湖万联深度参与到大会各项活动中&#xff0c;并全面展…