介绍

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
}

strconv:各种数据类型和字符串之间的相互转换的更多相关文章

  1. JSON对象与字符串之间的相互转换

    <html> <head> <meta name="viewport" content="width=device-width" ...

  2. Json数组操作小记 及 JSON对象和字符串之间的相互转换

    [{"productid":"1","sortindex":"2"},{"productid":&q ...

  3. JS中实现JSON对象和JSON字符串之间的相互转换

    对于主流的浏览器(比如:firefox,chrome,opera,safari,ie8+),浏览器自己提供了JSON对象,其中的parse和stringify方法实现了JSON对象和JSON字符串之间 ...

  4. JSON对象与字符串之间的相互转换 - CSDN博客

    原文:JSON对象与字符串之间的相互转换 - CSDN博客 <html> <head> <meta name="viewport" content=& ...

  5. java中基本数据类型、包装类及字符串之间的相互转换

    基本数据类型:不支持面向对象的编程机制(没有属性和方法),即不支持面向对象,之所以提供8中基本数据类型,是为了方便常规数据的处理. 包装类:通过包装类可以将基本数据类型的值包装为引用数据类型的对象,使 ...

  6. python 日期、时间处理,各种日期时间格式/字符串之间的相互转换究竟是怎样的?

    模块函数说明 ''' date 日期对象,常用的属性有year,month,day time 时间对象,常用的属性有hour,minute,second,毫秒 datetime 日期时间对象,常用的属 ...

  7. 【Python】bytes和hex字符串之间的相互转换。

    反复在几个环境上折腾码流的拼装解析和可读化打印,总是遇到hex字符串和bytes之间的转换,记录在这里吧. 1. 在Python2.7.x上(更老的环境真心折腾不起),hex字符串和bytes之间的转 ...

  8. Java字节、十进制、十六进制、字符串之间的相互转换

    1. 字节转10进制 直接使用(int)类型转换. /* * 字节转10进制 */ public static int byte2Int(byte b){ int r = (int) b; retur ...

  9. JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)

    在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接可以用JSON对象的stringify()和parse()方法. JSON.stringify(obj)将JSO ...

随机推荐

  1. ElasticSearch——原始文档和倒排索引

    一.原始文档 如上图所示, 第二象限是一份原始文档,有title和content2个字段,字段取值分别为”我是中国人”和” 热爱共X产党”,这一点没什么可解释的.我们把原始文档写入Elasticsea ...

  2. Mysql安装、查看密码、修改密码、初始化、修改字符类型

    安装mysql 参照python篇一键安装lnmp.安装完之后再按照下面修改密码,修改配置文件,否则安装的时候就修改配置文件会出错. 注意:这也是二进制安装mysql.另一种二进制安装容易出错,生产环 ...

  3. Java多线程——线程池使用示例

    示例代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public cla ...

  4. Azure DevOps的variable group实现array和hashtable参数的传递

    Azure Devops中的variable group建议或者只能(?)添加string类型的value.基于此我们想在variable group实现array或者hashtable的传递的核心思 ...

  5. Docker 镜像的推送(六)

    目录 一.为镜像命名 二.推送到官方 Docker Hub 1.首先得在 Docker Hub 上注册一个账号. 2.在 Docker Host 上登录 3.修改镜像命名 4.镜像上传 5.登录查看上 ...

  6. 【c# 学习笔记】构造函数

    构造函数 主要用于创建类的实例对象.当调用构造函数创建一个对象时,构造函数会为对象分配内存空间,并初始化类的成员.构造函数分为实例构造函数和静态构造函数两种. 1.实例构造函数 实例构造函数用于创建和 ...

  7. VMware虚拟机中CentOS7的硬盘空间扩容

    查看centos7系统挂载点信息 扩展VMWare-centos7硬盘空间 对新增加的硬盘进行分区.格式化 添加新LVM到已有的LVM组,实现扩容 1.查看centos7系统挂载点信息 df -h查看 ...

  8. CVE-2019-0708 RDP MSF漏洞利用

    CVE-2019-0708 RDP MSF漏洞复现 漏洞环境 使用 VMware 安装Windows7 X64 模拟受害机 Windows7 X64下载链接:链接: https://pan.baidu ...

  9. springboot使用activemq同时接收queue和topic消息

    原文链接:https://blog.csdn.net/jia_costa/article/details/79354478 新建springboot项目, pom文件如下 <?xml versi ...

  10. Servlet技术之——概述、实现、细节、获取资源、ServletConfig、ServletContext

    Servlet概述.实现.细节.获取资源.ServletConfig.ServletContext (一) Setvlet基本概述 (1) 什么是Servlet ? Servlet(Server Ap ...