golang之类型转换cast
Go 语言作为强类型语言,在使用 Golang 开发项目时,经常会遇到类型转换的场景,整型之间可以直接转换,字节切片和字符串之间也可以直接转换。
但是,如果整型和字符串之间做类型转换,则需要使用 strconv
标准库提供的函数。
01
标准库 strconv
类型转换
Go 语言标准库 strconv[1] 提供了一些类型转换的函数,比如在项目开发中使用比较多的整型和字符串之间的类型转换。
func main() {
salary := 5000
salaryStr := strconv.Itoa(salary)
fmt.Printf("%T salary=%d\n", salary, salary)
fmt.Printf("%T salaryStr=%s\n", salaryStr, salaryStr) age := "23"
ageInt, err := strconv.Atoi(age)
fmt.Printf("%T age=%s\n", age, age)
fmt.Printf("%T ageInt=%d err=%v\n", ageInt, ageInt, err)
}
输出:
int salary=5000
string salaryStr=5000
string age=23
int ageInt=23 err=<nil>
阅读上面这段代码,我们使用标准库 strconv
将整型变量 salary
转换为字符串类型变量 salaryStr
;将字符串类型变量 age
转换为整型变量 ageInt
。
但是,读者朋友们有没有发现一个问题,我们使用标准库 strconv
提供的函数 Atoi
将字符串类型变量转换为整型变量,得到的是 int
类型,如果我们需要得到一个 int8
类型的变量,我们需要继续做类型转换,例如:
age := "23"
ageInt, err := strconv.Atoi(age)
ageInt8 := int8(ageInt)
也就是说,如果我们需要将一个字符串类型的变量转换为一个非 int
类型的整型变量,需要做二次转换,在实际项目开发中,使用起来稍微繁琐一些。
此外,使用标准库 strconv
做类型转换,除了在一些场景中稍微繁琐之外,还有另外一个问题,我们先阅读以下一段代码。
func main() {
phoneNumber := "138001380001380013800013800138000"
phoneNumberInt, err := strconv.Atoi(phoneNumber)
fmt.Printf("%T phoneNumber=%s\n", phoneNumber, phoneNumber)
fmt.Printf("%T phoneNumberInt=%d err=%v\n", phoneNumberInt, phoneNumberInt, err)
}
输出:
string phoneNumber=138001380001380013800013800138000
int phoneNumberInt=9223372036854775807 err=strconv.Atoi: parsing "138001380001380013800013800138000": value out of range
阅读上面这段代码输出的错误信息 value out of range
,也就是说如果我们需要转换的值超出返回,Go 语言标准库 strconv
提供的函数 Atoi
会返回错误。
所以,在使用函数 Atoi
时,我们要做好参数验证和错误处理。
有没有使用更简单的类型转换库,接下来,我们来看一下流行的三方库 cast
。
02
三方库 cast
类型转换
Go 类型转换的三方库 cast
是一个使用比较多的库,我们使用 cast[2] 来处理 Part02 的类型转换需求,代码如下:
func main() {
age2 := "23"
age2Int8 := cast.ToInt8(age2)
fmt.Printf("%T age2=%s\n", age2, age2)
fmt.Printf("%T age2Int8=%d\n", age2Int8, age2Int8) phoneNumber2 := "138001380001380013800013800138000"
phoneNumber2Int := cast.ToInt(phoneNumber2)
fmt.Printf("%T phoneNumber2=%s\n", phoneNumber2, phoneNumber2)
fmt.Printf("%T phoneNumber2Int=%d\n", phoneNumber2Int, phoneNumber2Int)
}
输出:
string age2=23
int8 age2Int8=23
string phoneNumber2=138001380001380013800013800138000
int phoneNumber2Int=0
阅读上面这段代码,我们可以发现,使用 cast
可以直接将字符串类型的变量转换为我们需要的整型变量,使用起来不再感到繁琐。
同时,需要注意的是,如果转换失败,将返回类型零值,字符串类型变量 phoneNumber2
在使用 cast
转换为 int
类型的变量时,返回的结果就是 int
的类型零值。
使用 cast
比使用 strconv
更简单,而且不需要处理错误。但是,cast
还有一个陷阱,我们需要特别注意一下,我们先阅读以下一段代码:
func main() {
month := "07"
monthInt8 := cast.ToInt8(month)
fmt.Printf("%T month=%s\n", month, month)
fmt.Printf("%T monthInt8=%d\n", monthInt8, monthInt8) month2 := "08"
month2Int8 := cast.ToInt8(month2)
fmt.Printf("%T month2=%s\n", month2, month2)
fmt.Printf("%T month2Int8=%d\n", month2Int8, month2Int8)
}
输出:
string month=07
int8 monthInt8=7
string month2=08
int8 month2Int8=0
阅读上面这段代码的输出结果,我们可以发现使用 cast
将字符串类型 month
和 month2
转换为整型时,字符串是以 "0"
开头的月份,"07"
转换后得到整型 7
,而 "08"
转换后得到整型 0
。
我们再使用 strconv
转换 "08"
,代码如下:
func main() {
month2 := "08"
month2Int8 := cast.ToInt8(month2)
fmt.Printf("%T month2=%s\n", month2, month2)
fmt.Printf("%T month2Int8=%d\n", month2Int8, month2Int8) month2Int2, err := strconv.Atoi(month2)
fmt.Printf("%T month2Int2=%d err=%v\n", month2Int2, month2Int2, err)
}
输出:
int8 month2Int8=0
int month2Int2=8 err=<nil>
从输出结果可以看到,"08"
使用 strconv
转换后得到整型 8
,所以我们在转换以一个或多个 "0"
开头的字符串为整型时,字符串 "0"
后面的数值大于 7
将不能使用 cast
转换,最好就是在转换以一个或多个 "0"
开头的字符串为整型时,比如 "08"
、"009"
、"00010"
等,使用 strconv
转换,而不要使用 cast
转换。
golang之类型转换cast的更多相关文章
- PostgreSQL 自定义自动类型转换(CAST)
转载自:https://yq.aliyun.com/articles/228271 背景 PostgreSQL是一个强类型数据库,因此你输入的变量.常量是什么类型,是强绑定的,例如 在调用操作符时,需 ...
- 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数
第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; ...
- Golang的类型转换实战案例
Golang的类型转换实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型概述 基础数据类型概述,博主推荐阅读: 布尔型: https://www.cnblogs. ...
- postgres 类型转换 cast 转
转自: http://blog.csdn.net/yufenghyc/article/details/45869509 --1 例子postgres=# select 1/4; ?column? -- ...
- SQL SERVER中强制类型转换cast和convert的区别
在SQL SERVER中,cast和convert函数都可用于类型转换,其功能是相同的, 只是语法不同. cast一般更容易使用,convert的优点是可以格式化日期和数值. 代码 select CO ...
- 8. golang 基本类型转换
golang 类型转换只能显性转换 不能自动转换 基本数据类型间的转换 var x1 int = 2 var x2 int16 var x3 int8 x2 = 200 + x1 x3 = 200 + ...
- SqlServer基础:类型转换Cast和Convert
在SqlServer要对不同类型的数据进行运算时,需要将其转换为相同类型之后再做操作,而SqlServer中有两个函数可以进行数据转换,即:Cast和Convert 1.Cast CAST(expre ...
- 报错:对象必须实现 IConvertible;以分隔符进行分割链接concat_ws的使用方法;mysql数据类型转换cast,convert
错误故障,mysql 服务器上用 concat_ws 函数,连接了一串数字,最后 服务器返回的字段就变成了一个 byte ,而我们想要的类型是 string 类型,那么转换的时候,就报错了. 正确 ...
- golang数据类型转换
int--string //string到int value_int,err:=strconv.Atoi(string) //int到string str:=strconv.Itoa(value_in ...
- golang强制类型转换
github.com/Unknwon/com包的使用 package main import ( "fmt" "github.com/Unknwon/com" ...
随机推荐
- JS 希尔排序完全理解
希尔排序的思想直白点来说就是间隔对比,比如说 我有一个数组,长度为9,则第一次分割间隔为长度的1/3 + 1,则第一次对比就是1 比 4,2 比 5, 3 比 6,4 比 7,5 比 8 , 6 比 ...
- Angular 学习笔记 work with excel (导出 excel)
更新: 2020-04-15 补上 read excel 先用 file reader 把文件变成 buffer 然后调用 exceljs 就可以了, 它很聪明的哦, date number, boo ...
- JAVAEE——JDK安装
1.JDK下载 (1)jdk官网 1.输入下载地址:Oracle Software Downloads | Oracle 2.向下滑动,找到Developer Downloads后点击java 3.点 ...
- CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
前言 今天大姚给大家分享一款由.NET开源.免费.强大的Visual Studio代码简化.整理.格式化实用插件:CodeMaid. 工具介绍 CodeMaid是一款由.NET开源.免费.强大的Vis ...
- Hugging Face 论文平台 Daily Papers 功能全解析
文/ Adeena, 在快速发展的研究领域,保持对最新进展的关注至关重要.为了帮助开发者和研究人员跟踪 AI 领域的前沿动态,Hugging Face 推出了 Daily Papers 页面.自发布以 ...
- C# WebSocket Servers -- Fleck、SuperSocket、TouchSocke
最近在维护老项目,感觉内存一直都有问题,定位到问题是WebSocketServer的问题,了解了 Fleck.SuperSocket.TouchSocke 等开源项目,这里记录一下. .net5..n ...
- springboot多文件上传、删除、下载到项目本地
package com.example.demo.document; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUti ...
- dotnet 虚方法的使用
// 虚方法 // 作用:允许子类,进行重写,可以实现不一样的功能 // 特点:好维护 -- 不该变原方法(虚方法)情况下,可以直接使用虚方法或者重写虚方法 VirtualMethod method ...
- element的图片上传预处理函数
/** 图片格式和大小的控制 */ beforeAvatarUpload (file) { // 允许上传 jpg 和 png 格式的图片 const isJPG = file.type === &q ...
- HarmonyOS NEXT开发之ArkTS自定义组件学习笔记
在HarmonyOS中,ArkTS提供了创建自定义组件的能力,允许开发者封装和复用UI代码.以下是关于自定义组件的详细介绍,包括创建自定义组件.页面和自定义组件的生命周期.自定义组件的自定义布局.冻结 ...