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的更多相关文章

  1. PostgreSQL 自定义自动类型转换(CAST)

    转载自:https://yq.aliyun.com/articles/228271 背景 PostgreSQL是一个强类型数据库,因此你输入的变量.常量是什么类型,是强绑定的,例如 在调用操作符时,需 ...

  2. 第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;  ...

  3. Golang的类型转换实战案例

    Golang的类型转换实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型概述 基础数据类型概述,博主推荐阅读: 布尔型: https://www.cnblogs. ...

  4. postgres 类型转换 cast 转

    转自: http://blog.csdn.net/yufenghyc/article/details/45869509 --1 例子postgres=# select 1/4; ?column? -- ...

  5. SQL SERVER中强制类型转换cast和convert的区别

    在SQL SERVER中,cast和convert函数都可用于类型转换,其功能是相同的, 只是语法不同. cast一般更容易使用,convert的优点是可以格式化日期和数值. 代码 select CO ...

  6. 8. golang 基本类型转换

    golang 类型转换只能显性转换 不能自动转换 基本数据类型间的转换 var x1 int = 2 var x2 int16 var x3 int8 x2 = 200 + x1 x3 = 200 + ...

  7. SqlServer基础:类型转换Cast和Convert

    在SqlServer要对不同类型的数据进行运算时,需要将其转换为相同类型之后再做操作,而SqlServer中有两个函数可以进行数据转换,即:Cast和Convert 1.Cast CAST(expre ...

  8. 报错:对象必须实现 IConvertible;以分隔符进行分割链接concat_ws的使用方法;mysql数据类型转换cast,convert

    错误故障,mysql  服务器上用 concat_ws 函数,连接了一串数字,最后 服务器返回的字段就变成了一个 byte ,而我们想要的类型是  string 类型,那么转换的时候,就报错了. 正确 ...

  9. golang数据类型转换

    int--string //string到int value_int,err:=strconv.Atoi(string) //int到string str:=strconv.Itoa(value_in ...

  10. golang强制类型转换

    github.com/Unknwon/com包的使用 package main import ( "fmt" "github.com/Unknwon/com" ...

随机推荐

  1. Java基础 韩顺平老师的 泛型 的部分笔记

    553,泛型引入 package com.hspedu.list_; import java.util.*; import java.util.concurrent.CompletionService ...

  2. three.js添加3d模型

    three官方的几何体也就那么几个,想要生成各种各样的模型,其难度十分之大,这时引入外部模型也不失为一种选择.具体引入办法如下. 导入依赖 点击查看代码 import * as THREE from ...

  3. 计算机网络之TCP/IP协议简介

    TCP/IP协议 简介 首先TCP/IP协议不只是表示TCP协议和IP协议两种协议,而是一个协议簇.协议簇是什么并不难理解,就是字面意思,一个由多个协议组合而成的集合体,其中最有代表性的就是TCP和I ...

  4. Angular 18+ 高级教程 – NgModule

    前言 NgModule 在 Angular v14 以前是一门必修课.然而,自 Angular v14 推出 Standalone Component 以后,它的地位变得越来越边缘化了. 本教程从开篇 ...

  5. 系统编程-进程-当文件操作遇上fork

    我的关联博文: 系统编程-进程-fork深度理解.vfork简介 系统编程-进程-先后fork或open一个文件的区别 test1:   lseek基本使用 #include <stdio.h& ...

  6. [33](CSP 集训)CSP-S 模拟 4

    A 商品 对于任意一组相邻的数 \((l,r)\ (l\le r)\),可以发现,不管怎么压缩,都会有 \(l\le r\),也就是说,相邻两个数的大小关系是不变的 那么我们就可以把 \(\sum(| ...

  7. Windows远程设置''不可复制''的权限

    起因: 有一个技术部门的同事需要远程其他同学的电脑进行操作,但是不允许他复制目标电脑上的文件,避免造成资料外泄 解决办法: 组策略编辑器中,设置 计算机配置 -> 管理模板 -> wind ...

  8. 【赵渝强老师】Kafka的消息持久化

    1.Kafka消息持久性概述 Kakfa依赖文件系统来存储和缓存消息.对于硬盘的传统观念是硬盘总是很慢,基于文件系统的架构能否提供优异的性能?实际上硬盘的快慢完全取决于使用方式.同时 Kafka 基于 ...

  9. map&unordered_map<key,value>key使用自定义类的要求

    std::unordered_map 的键要求: std::unordered_map 是基于哈希表的数据结构. 它要求键类型必须支持哈希计算,也就是必须有对应的 std::hash 函数. 另外,键 ...

  10. union联合体的缺陷

    传统的 union 联合体在 C++ 中虽然提供了一种能够在相同的内存空间内存储多种不同类型的方式,但它也有一些显著的缺陷和限制.这些缺陷让 union 的使用不太安全,尤其是在复杂的程序中.以下是传 ...