一文了解 Go 标准库 strconv:string 与其他基本数据类型的转换

时间:2022-12-01 11:20:44

耐心和持久胜过激烈和*。

哈喽大家好,我是陈明勇,今天分享的知识是 Go 标准库 —— strconv。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

前言

上篇文章 ​​一文了解 Go 标准库 strings 常用函数和方法​​​ 介绍了 ​​strings​​​ 标注库里的一些常用的函数和方法,本文也是以 ​​string​​​ 类型为中心,通过 ​​strconv​​ 标准库,介绍其与其他基本数据类型相互转换的函数。

strconv

​strconv​​​ 包提供了 ​​string​​​ 类型与其他基本数据类型之间转换的函数,本文不会介绍其所有函数,如果有想了解更多的小伙伴可以到 ​​Go 包文档​​ 查看。

string 与 int 之间的转换

Itoa:int 类型转 string 类型

​Itoa(i int) string​

  • 函数的参数为待转换的数字
  • 函数的返回值为转换之后的字符串

import (
"fmt"
"strconv"
)

func main() {
num := 16
str := strconv.Itoa(num)
fmt.Printf("类型:%T,值:%s", str, str) // 类型:string,值:16
}

Atoi:string 类型转 int 类型

​Atoi(s string) (int, error)​

  • 函数的参数为待转换的字符串
  • 返回值有两个,第一个是转换之后的整形数字,第二个是错误描述。

import (
"fmt"
"strconv"
)

func main() {
str := "666"
num, err := strconv.Atoi(str)
if err != nil {
fmt.Println("err: ", err.Error())
return
}
fmt.Printf("类型:%T,值:%d", num, num) // 类型:int,值:666
}

此函数与 ​​Itoa​​​ 函数相比,多了一个 ​​error​​​ 返回值,是因为如果是传入的字符串无法转成数字,例如 ​​1a1​​​,此函数就会返回 ​​NumError​​​ 错误,而 ​​Itoa​​​ 函数,无论传入的是什么样的数字,都可以转为 ​​string​​​,因此在转换的过程中没有 ​​error​​ 的说法。

FormatInt:将数字转成指定进制数并以 string 类型返回

​FormatInt(i int64, base int) string​

  • 第一个参数为指定数字,类型为 ​​int64​
  • 第二个参数为指定进制
  • 第三个参数为数字转成指定进制数后的字符串

import (
"strconv"
)

func main() {
var num int64 = 2
str := strconv.FormatInt(num, 2)
var num2 int64 = 17
str2 := strconv.FormatInt(num2, 16)
println(str) // 10
println(str2) // 11
}

上述代码实现了将数字 ​​2​​​ 转成二进制的形式 ​​10​​​,将数字 ​​17​​​ 转成十六进制的形式 ​​11​​​,并以 string 类型返回。上述数字皆代表着有符号为的 ​​int64​​​ 类型,与之对应的还有无符号位的 ​​uint64​​​ 类型的转换函数 ​​FormatUint​​。

ParseInt:给定基数(进制数)和位数,返回对应十进制的值

​ParseInt(s string, base int, bitSize int) (i int64, err error)​

  • 第一个参数 ​​s​​ 为待解析的字符串
  • 第二个参数 ​​base​​​ 为基数,也就是进制数,从 ​​0​​​、​​2​​​ 到 ​​36​​ 进制。
  • 第三个参数 ​​bitSize​​​ 为位数,​​0​​​、​​8​​​、​​16​​​、​​32​​​、​​64​​​位分别对应 ​​int​​​、​​int8​​​、​​int16​​​、​​int32​​​、​​int64​​​。如果 ​​bitSize​​​ 小于 ​​0​​​ 或大于 ​​64​​,则返回错误。
  • 第一个返回值 ​​i​​ 为转换之后的数字
  • 第二个返回值 ​​err​​​ 为转换时产生的错误信息,除了 ​​bitSize​​​ 小于 ​​0​​​ 或大于 ​​64​​​,会发生错误以外,如果所传的字符串 ​​s​​​ 与 ​​base​​​ 参数或 ​​bitSize​​ 参数不匹配,也会发生错误。

import (
"fmt"
"strconv"
)

func main() {
parseInt, err := strconv.ParseInt("100", 2, 64)
if err != nil {
fmt.Println(err.Error())
return
}
println(parseInt) // 4

parseInt2, err := strconv.ParseInt("666", 2, 64)
if err != nil {
fmt.Println(err.Error()) // strconv.ParseInt: parsing "666": invalid syntax
return
}
println(parseInt2)
}

首先将二进制的 ​​100​​​ 转成十进制,为 ​​4​​​,然后将二进制的 ​​666​​​ 转成十进制,但是二进制所对应的数字没有 666,因此转换错误,返回 ​​strconv.ParseInt: parsing "666": invalid syntax​​​ 错误信息。与之对应的还有返回无符号位的 ​​uint64​​​ 类型的转换函数 ​​ParseUint​​。

string 与 float 之间的转换

ParseFloat:字符串类型转浮点型类型

​ParseFloat(s string, bitSize int) (float64, error)​

  • 第一个参数 ​​s​​ 为带转换的字符串。
  • 第二个参数为 ​​bitSize​​​ 为转换后的位数,​​32​​​ 代表 ​​float32​​​,​​64​​​ 代表 ​​float64​​。
  • 第一个返回值为转换后的浮点型数字。
  • 第二个返回值为转换过程中所产生的错误

import (
"fmt"
"strconv"
)

func main() {
num, err := strconv.ParseFloat("11.05", 64)
if err != nil {
return
}
fmt.Println(num)
}

如果传入的 ​​s​​​ 的语法错误如 ​​1s1​​​,则转换失败,返回 ​​error​​。

FormatFloat:根据格式 fmt 和精度 prec 将浮点数 f 转换为字符串

​FormatFloat(f float64, fmt byte, prec, bitSize int) string​

  • 第一个参数 ​​f​​ 为待转换的浮点数。
  • 第二个参数为格式,可选值有​​b e E f g G x X​​。
  • 第三个参数 ​​prec​​ 为精度,精确到几位小数。
  • 返回值为转换后的字符串。

import (
"fmt"
"strconv"
)

func main() {
str := strconv.FormatFloat(5.26, 'f', 1, 64)
fmt.Println(str) // 5.3
}

​FormatFloat​​ 函数会对结果值进行四舍五入计算。

string 与 bool 之间的转换

ParseBool:字符串转布尔值

​ParseBool(str string) (bool, error)​

  • 第一个参数 ​​str​​ 为待转换的字符串
  • 第一个返回值为转换之后的 ​​bool​​ 值
  • 第二个返回值为转换时所产生的错误。

import (
"fmt"
"strconv"
)

func main() {
bool1, err := strconv.ParseBool("true")
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(bool1) // true

bool2, err := strconv.ParseBool("golang")
if err != nil {
fmt.Println(err.Error()) // strconv.ParseBool: parsing "golang": invalid syntax
return
}
fmt.Println(bool2)
}

第一个字符串 ​​true​​​ 转布尔值成功了,但是第二个字符串 ​​golang​​​ 转布尔值失败了,因为 ​​bool​​​ 类型的可选值只有 ​​true​​​ 和 ​​false​​,其他值无法转成布尔值。

FormatBool:布尔值转字符串

​FormatBool(b bool) string​

  • 参数 ​​b​​ 为带转换的布尔值。
  • 返回值为转换之后的字符串。

import (
"fmt"
"strconv"
)

func main() {
boolStr := strconv.FormatBool(true)
fmt.Println(boolStr) // "true"
}

小结

本文对 ​​string​​​ 与 ​​int​​​ 类型、​​float​​​ 类型和 ​​bool​​​ 类型相互之间转换的函数进行介绍,掌握这些函数的用法,应对开发中 ​​string​​ 类型与其他基本数据类型转换的场景不成问题。