经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Go基础系列:数据类型转换(strconv包)
来源:cnblogs  作者:骏马金龙  时间:2018/10/29 9:55:54  对本文有异议

Go不会对数据进行隐式的类型转换,只能手动去执行转换操作。

简单的转换操作

转换数据类型的方式很简单。

  1. valueOfTypeB = typeB(valueOfTypeA)

例如:

  1. // 浮点数
  2. a := 5.0
  3. // 转换为int类型
  4. b := int(a)

Go允许在底层结构相同的两个类型之间互转。例如:

  1. // IT类型的底层是int类型
  2. type IT int
  3. // a的类型为IT,底层是int
  4. var a IT = 5
  5. // 将a(IT)转换为int,b现在是int类型
  6. b := int(5)
  7. // 将b(int)转换为IT,c现在是IT类型
  8. c := IT(b)

但注意:

  1. 不是所有数据类型都能转换的,例如字母格式的string类型"abcd"转换为int肯定会失败
  2. 低精度转换为高精度时是安全的,高精度的值转换为低精度时会丢失精度。例如int32转换为int16,float32转换为int
  3. 这种简单的转换方式不能对int(float)和string进行互转,要跨大类型转换,可以使用strconv包提供的函数

strconv

strconv包提供了简单数据类型之间的类型转换功能。可以将简单类型转换为字符串,也可以将字符串转换为其它简单类型。

这个包里提供了很多函数,大概分为几类:

  • 字符串转int:Atoi()
  • int转字符串: Itoa()
  • ParseTP类函数将string转换为TP类型:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。因为string转其它类型可能会失败,所以这些函数都有第二个返回值表示是否转换成功
  • 其它类型转string类型:FormatBool()、FormatFloat()、FormatInt()、FormatUint()
  • AppendTP类函数用于将TP转换成字符串后append到一个slice中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()

还有其他一些基本用不上的函数,见官方手册:go doc strconv或者https://golang.org/pkg/strconv/。

当有些类型无法转换时,将报错,返回的错误是strconv包中自行定义的error类型。有两种错误:

  1. var ErrRange = errors.New("value out of range")
  2. var ErrSyntax = errors.New("invalid syntax")

例如,使用Atoi("a")将"a"转换为int类型,自然是不成功的。如果print输出err信息,将显示:

  1. strconv.Atoi: parsing "a": invalid syntax

string和int的转换

最常见的是字符串和int之间的转换:

1.int转换为字符串:Itoa()

  1. // Itoa(): int -> string
  2. println("a" + strconv.Itoa(32)) // a32

2.string转换为int:Atoi()

  1. func Atoi(s string) (int, error)

由于string可能无法转换为int,所以这个函数有两个返回值:第一个返回值是转换成int的值,第二个返回值判断是否转换成功。

  1. // Atoi(): string -> int
  2. i,_ := strconv.Atoi("3")
  3. println(3 + i) // 6
  4. // Atoi()转换失败
  5. i,err := strconv.Atoi("a")
  6. if err != nil {
  7. println("converted failed")
  8. }

Parse类函数

Parse类函数用于转换字符串为给定类型的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。

由于字符串转换为其它类型可能会失败,所以这些函数都有两个返回值,第一个返回值保存转换后的值,第二个返回值判断是否转换成功。

  1. b, err := strconv.ParseBool("true")
  2. f, err := strconv.ParseFloat("3.1415", 64)
  3. i, err := strconv.ParseInt("-42", 10, 64)
  4. u, err := strconv.ParseUint("42", 10, 64)

ParseFloat()只能接收float64类型的浮点数。

ParseInt()和ParseUint()有3个参数:

  1. func ParseInt(s string, base int, bitSize int) (i int64, err error)
  2. func ParseUint(s string, base int, bitSize int) (uint64, error)

bitSize参数表示转换为什么位的int/uint,有效值为0、8、16、32、64。当bitSize=0的时候,表示转换为int或uint类型。例如bitSize=8表示转换后的值的类型为int8或uint8。

base参数表示以什么进制的方式去解析给定的字符串,有效值为0、2-36。当base=0的时候,表示根据string的前缀来判断以什么进制去解析:0x开头的以16进制的方式去解析,0开头的以8进制方式去解析,其它的以10进制方式解析。

以10进制方式解析"-42",保存为int64类型:

  1. i, _ := strconv.ParseInt("-42", 10, 64)

以5进制方式解析"23",保存为int64类型:

  1. i, _ := strconv.ParseInt("23", 5, 64)
  2. println(i) // 13

因为5进制的时候,23表示进位了2次,再加3,所以对应的十进制数为5*2+3=13

以16进制解析23,保存为int64类型:

  1. i, _ := strconv.ParseInt("23", 16, 64)
  2. println(i) // 35

因为16进制的时候,23表示进位了2次,再加3,所以对应的十进制数为16*2+3=35

以15进制解析23,保存为int64类型:

  1. i, _ := strconv.ParseInt("23", 15, 64)
  2. println(i) // 33

因为15进制的时候,23表示进位了2次,再加3,所以对应的十进制数为15*2+3=33

Format类函数

将给定类型格式化为string类型:FormatBool()、FormatFloat()、FormatInt()、FormatUint()。

  1. s := strconv.FormatBool(true)
  2. s := strconv.FormatFloat(3.1415, 'E', -1, 64)
  3. s := strconv.FormatInt(-42, 16)
  4. s := strconv.FormatUint(42, 16)

FormatInt()和FormatUint()有两个参数:

  1. func FormatInt(i int64, base int) string
  2. func FormatUint(i uint64, base int) string

第二个参数base指定将第一个参数转换为多少进制,有效值为2<=base<=36。当指定的进制位大于10的时候,超出10的数值以a-z字母表示。例如16进制时,10-15的数字分别使用a-f表示,17进制时,10-16的数值分别使用a-g表示。

例如:FormatInt(-42, 16)表示将-42转换为16进制数,转换的结果为-2a。

FormatFloat()参数众多:

  1. func FormatFloat(f float64, fmt byte, prec, bitSize int) string

bitSize参数表示转换为多少位(32或64)的浮点数对应的字符串。

Append类函数

AppendTP类函数用于将TP转换成字符串后append到一个slice中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()。

Append类的函数和Format类的函数工作方式类似,只不过是将转换后的结果追加到一个slice中。

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. func main() {
  7. // 声明一个slice
  8. b10 := []byte("int (base 10):")
  9. // 将转换为10进制的string,追加到slice中
  10. b10 = strconv.AppendInt(b10, -42, 10)
  11. fmt.Println(string(b10))
  12. b16 := []byte("int (base 16):")
  13. b16 = strconv.AppendInt(b16, -42, 16)
  14. fmt.Println(string(b16))
  15. }

输出结果:

  1. int (base 10):-42
  2. int (base 16):-2a
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号