• strconv:各种数据类型和字符串之间的相互转换


    介绍

    strconv包实现了基本数据类型和其对应字符串之间的相互转换。主要有一下常用函数:AtoiItoaParse系列Formart系列Append系列

    string和int之间的转换

    这一种是我们经常使用的,但是我知道包括我在内,尤其是搞python的,肯定都这么干过

    package main
    
    import "fmt"
    
    func main() {
    	num := 97
    	fmt.Println(string(num))  // a
    }
    

    结果发现打印出来的是个a,因为golang的字符串底层实质上就是一个个字节组成的字节数组,如果使用string(num)这种方式,那么会将num这个数值对应字符转成字符串打印出来,而ASCII码中97和a是对应的的,所以打印了a

    Itoa

    如果想把int转成string应该是用Itoa, i就是integer,这个a是什么?其实这个a就是字符串,只不过这是从C语言中遗留下来的,因为C中没有字符串的概念,而是使用字符数组,所以这个a在C中是array。但是在go中就把a当中字符串即可

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	num := 97
    	fmt.Println(strconv.Itoa(num))  // 97
    	fmt.Println(strconv.Itoa(num) == "97")  // true
    }
    

    Atoi

    既然能把整型转成字符串,那么能不能把字符串转换为整型呢?显然是可以的,反过来即可,也就是Atoi

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	//整型转字符串可以直接转,但是字符串转整型,则是有可能发生错误的,因为必须要求字符串的每一个字符必须是数字也可以转
    	//所以这里除了返回结果,还会返回一个error
    	str := "97"
    	if num , err := strconv.Atoi(str); err != nil {
    		fmt.Println(err)
    	} else {
    		fmt.Println(num)  //97
    	}
    
    
    	str = "97xx"
    	if num , err := strconv.Atoi(str); err != nil {
    		fmt.Println(err)  //strconv.Atoi: parsing "97xx": invalid syntax
    	} else {
    		fmt.Println(num)
    	}
    }
    

    Parse系列函数

    Parse类函数用于转换字符串为给定类型的值:ParseBoolParseFloatParseIntParseUint

    ParseBool

    将指定字符串转换为对应的bool类型,只接受1、0、t、f、T、F、true、false、True、False、TRUE、FALSE,否则返回错误

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	//因为是字符串转回去,必然可能发生转化失败的情况,因此都会多返回一个error
    	//而这里解析成功了,所以error是nil
    	fmt.Println(strconv.ParseBool("1"))  // true <nil>
    	fmt.Println(strconv.ParseBool("F")) // false <nil>
    }
    

    ParseInt

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

    • s:转成int的字符串
    • base:指定进制(2到36),如果base为0,那么会从字符串的前置来判断,如0x表示16进制等等,如果前缀也没有那么默认是10进制
    • bistSize:整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64

    返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	fmt.Println(strconv.ParseInt("0x16", 0, 0))  // 22 <nil>
    	fmt.Println(strconv.ParseInt("16", 16, 0))  // 22 <nil>
    	fmt.Println(strconv.ParseInt("16", 0, 0))  // 16 <nil>
    
    	//这里是八进制,在go 1.13中可以使用0o前缀,但我目前使用的1.12,所以直接使用0作为前缀表示八进制
    	fmt.Println(strconv.ParseInt("016", 0, 0))  // 14 <nil>
    
    	//进制为2,但是字符串出现了6,无法解析
    	fmt.Println(strconv.ParseInt("16", 2, 0))  // 0 strconv.ParseInt: parsing "16": invalid syntax
    
    	//只指定8位,显然存不下。最后给了一个能存储的最大的值
    	fmt.Println(strconv.ParseInt("257", 0, 8))  // 127 strconv.ParseInt: parsing "257": value out of range
    
    	//还可以指定正负号
    	fmt.Println(strconv.ParseInt("-0x16", 0, 0))  // -22 <nil>
    	fmt.Println(strconv.ParseInt("-016", 0, 0))  // -14 <nil>
    
    }
    

    ParseUnit

    ParseUint类似ParseInt,但不接受正负号,用于无符号整型。

    ParseFloat

    func ParseFloat(s string, bitSize int) (f float64, err error)

    • bitSize:32、64,表示对应精度的float
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	fmt.Println(strconv.ParseFloat("3.14", 64))  //3.14 <nil>
    
    }
    

    Format系列函数

    Format系列函数就比较简单了,就是将指定数据类型格式化成字符串,Parse则是将字符串解析成指定数据类型,这两个是相反的。转成字符串的话,则不需要担心error了。

    FormatBool

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	fmt.Println(strconv.FormatBool(true))  //true
    	fmt.Println(strconv.FormatBool(false) == "false")  //true
    }
    

    FormatInt

    传入字符串和指定的进制

    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	//数值是22,但是它是16进制的,所以对应成10进制是16
    	fmt.Println(strconv.FormatInt(22, 16))  //16
    }
    

    FormatUint

    是FormatInt的无符号版本

    FormatFloat

    函数将浮点数表示为字符串并返回。

    func FormatFloat(f float64, fmt byte, prec, bitSize int) string
    
    • f:float64
    • fmt:fmt表示格式:’f’(-ddd.dddd)、’b’(-ddddp±ddd,指数为二进制)、’e’(-d.dddde±dd,十进制指数)、’E’(-d.ddddE±dd,十进制指数)、’g’(指数很大时用’e’格式,否则’f’格式)、’G’(指数很大时用’E’格式,否则’f’格式)。
    • prec:prec控制精度(排除指数部分),对’f’、’e’、’E’,它表示小数点后的数字个数;对’g’、’G’,它控制总的数字个数。如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f。
    • bitSize:f是哪一种float,32或者64
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	fmt.Println(strconv.FormatFloat(3.1415, 'f', -1, 64))  //3.1415
    	fmt.Println(strconv.FormatFloat(3.1415, 'e', -1, 64))  //3.1415e+00
    	fmt.Println(strconv.FormatFloat(3.1415, 'E', -1, 64))  //3.1415E+00
    	fmt.Println(strconv.FormatFloat(3.1415, 'g', -1, 64))  //3.1415
    }
    
  • 相关阅读:
    a和b互换的2种方式
    spring cloud 方法调用 feign
    spring boot redis 五种类型使用实例
    springboot引入properties文件 yml文件
    Spark-Streaming结合Redis
    Spark-Streaming结合Mysql案例
    Springboot与scala编写第一个web程序
    Springboot工程Mybatis二级缓存配置
    小奇画画
    saf
  • 原文地址:https://www.cnblogs.com/traditional/p/11904423.html
Copyright © 2020-2023  润新知