『Go 内置库第一季:strconv』

大家好,我叫谢伟,是一名程序员。

近期会持续更新内置库的学习内容,主要的参考文献是:godoc, 和源码

日常编写代码的过程中,字符串和数值型、布尔类型之间的转换算是很频繁了。所以有必要研究下内置的 strconv 库。

这节的主题是:字符串和其他基本数据类型之间的转换。

除此之外,还有其他类型的转换,最值得研究的就是 json , 这些内容,下期再讲。

大纲:

  • 有哪些基本的数据类型
  • 自己总结的常用的API
  • 文档给出的常用的API
  • 学到了什么

有哪些基本的数据类型

  • 既然是字符串和其他基本数据类之间的转换,那字符串可以操作的基本数据类型有哪些?
  • 字符串转换为其他数据类型的函数有什么相似点?
  • 其他数据类型转换为字符串有什么相似点?

怎么知道这些答案?

  • 看文档API
func Atoi(s string) (int, error)
func CanBackquote(s string) bool
func FormatBool(b bool) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func IsGraphic(r rune) bool
func IsPrint(r rune) bool
func Itoa(i int) string
func ParseBool(str string) (bool, error)
func ParseFloat(s string, bitSize int) (float64, error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)
  1. 大概可以得出答案:基本的数据类型指的是:布尔类型、数值型(整型、浮点型)
  2. 其他数据类型转换为字符串的函数多以:Format 为关键字
  3. 字符串转换为其他数据类型的函数多以:Parse 为关键字

自己常用的有哪些用法

  • 字符串转整型: strconv.Atoi
func toInt(value string) (result int) {
    result, _ = strconv.Atoi(value)
    return

}

原理是:"abc" -- > a*100 + b*10 + c

  • 整型转字符串: strconv.Itoa
func toString(value int) (result string) {
    result = strconv.Itoa(value)
    return
}
  • 字符串和布尔型之间的转换
func toBool(value string) (result bool) {
    result, _ = strconv.ParseBool(value)
    return
}

func boolToString(value bool) (result string) {
    result = strconv.FormatBool(value)
    return
}
  • 字符串和浮点型数值之间的转换
func toFloat(value string) (result float64) {
    result, _ = strconv.ParseFloat(value, 32)
    return
}

func floatToString(value float64) (result string) {
    result = strconv.FormatFloat(value, 'E', -1, 32)
    return
}

浮点数需要注意精度。

因为数值存在进制的原因:所以需要熟悉这些概念:

  • base: 基准,进制 2,8,10,16
  • bitsize: 浮点类型 32,64

可以看出:

  • 字符串转其他类型容易出错,所以作者返回了 error, 关键字:Parse
  • 其他类型转字符串,没有错误处理, 关键字:Format

私以为,掌握这些能处理绝大多数场景。

文档给出的API

字符串和整型

func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
func Atoi(s string) (i int, err error)
func toBaseInt(value string) (result int64) {
    result, _ = strconv.ParseInt("123", 8, 32)
    return
}

表示将 8 进制的 “123” 的字符串转为整型:1*8*8+2*8+3*1=83

所以可以将任意进制的数据转换为 整型,字符串转成整型有错误处理,比如 7 进制的数“128” 出现 8, 那么肯定报错。

另外还存在无符号的数转换

func IntToString(value int64) (result string) {
    return strconv.FormatInt(value, 8)
}

func main(){
    fmt.Println(IntToString(123))
}

>> 173

8 进制的 173 和 10 进制的 123 相等
1*64 + 7*8 + 3 = 64 + 56 + 3 = 123

总结这种转换:

  • 注意进制
  • 注意精度

布尔和字符串

func ParseBool(str string) (value bool, err error)
func FormatBool(b bool) string

需要注意的是:

  • 布尔值不是只 true 和 false, 表达式的值,比如 0<1 也表示false
  • 字符串的 true 和 false, 下面这种情况不行:FAlse, TRue, tRUE, fALSE , 所以要么大写,要么小写,要么首字母大写,要么就单个字符,为了避免出现这种情况,最好将字符串统一小写或者大写处理

浮点型和字符串

func ParseFloat(s string, bitSize int) (f float64, err error)
func FormatFloat(f float64, fmt byte, prec, bitSize int) string

可能会对 参数 fmt 有疑问,其实很好理解,fmt 格式化对浮点型有哪些操作?

%b      无小数部分的,指数为二的幂的科学计数法,与 strconv.FormatFloat   
        的 'b' 转换格式一致。例如 -123456p-78
%e      科学计数法,例如 -1234.456e+78                                  Printf("%e", 10.2)                          1.020000e+01
%E      科学计数法,例如 -1234.456E+78                                  Printf("%e", 10.2)                          1.020000E+01
%f      有小数点而无指数,例如 123.456                                 Printf("%f", 10.2)                          10.200000
%g      根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的0)输出             Printf("%g", 10.20)                         10.2
%G      根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的0)输出             Printf("%G", 10.20+2i)                      (10.2+2i)

其他

func Quote(s string) string
func QuoteRune(r rune) string
func QuoteRuneToASCII(r rune) string
func QuoteRuneToGraphic(r rune) string
func QuoteToASCII(s string) string
func QuoteToGraphic(s string) string

简单来说,就是给加上引号, 适合双引号或者单引号内的内容加引号。

学到了什么

  • 错误处理

实现项目的中规范错误处理机制,比如错误码的含义,具体显示的信息之类的非常重要。

一般的项目中是如何处理的呢?

type ErrorCode struct{
    Code int
    Message string
}

func (e ErrorCode) Error()string{
    return fmt.Sprintf("Code: %d, Message: %s", e.Code, e.Message)
}


var Global strcut {
    ErrorRoute = ErrorCode{}
    ErrorDB = ErrorCode{}
    ...
}

看上去和 strconv 库的错误处理机制类似:

  • 定义一个结构体
  • 实现 error 接口
type NumError struct {
    Func string // the failing function (ParseBool, ParseInt, ParseUint, ParseFloat)
    Num  string // the input
    Err  error  // the reason the conversion failed (e.g. ErrRange, ErrSyntax, etc.)
}

func (e *NumError) Error() string {
    return "strconv." + e.Func + ": " + "parsing " + Quote(e.Num) + ": " + e.Err.Error()
}
  • 错误处理的两者实现方式
errors.New()
fmt.Errorf()

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hongten

python开发_python中的Boolean运算和真假值

2191
来自专栏Golang语言社区

Go语言实现的排列组合问题实例(n个数中取m个)

本文实例讲述了Go语言实现的排列组合问题。分享给大家供大家参考,具体如下: (一)组合问题 组合是一个基本的数学问题,本程序的目标是输出从n个元素中取m个的所有...

3705
来自专栏每周一脱topic

彻底搞懂golang中的数组和切片slice

通过了解数组array和切片slice的使用和底层原理,可以更透彻的理解他们的使用场景,里面有什么坑。这对我们平时编写程序是极有裨益的,后面我会继续深入,有时间...

1.6K4
来自专栏北京马哥教育

Python练手题,敢来挑战吗?

这到题用到了字符串的所有字母大写和所有字母小写和字符串拼接,复制,用到的函数有 json 将列表中的内容按照指定字符连接成一个字符串,

1040
来自专栏一个会写诗的程序员的博客

《Kotlin极简教程》第四章 Kotlin基础语法表达式Null Check循环枚举遍历Map拼接字符串基本类型

在Kotlin中,所有东西都是对象,所以我们可以调用成员函数和属性的任何变量对象。有些类型是内置的,他们的实现被优化过, 但是用户看起来他们就像普通的类. 本节...

1843
来自专栏Coding迪斯尼

使用普拉特分析法解析极为复杂的算术表达式

1093
来自专栏Pythonista

Golang之匿名函数和闭包

 基本概念 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者 任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块...

3001
来自专栏mukekeheart的iOS之旅

iOS学习——属性引用self.xx与_xx的区别

 在iOS开发过程中,我们用@proprety声明一个属性后,在代码中我们可以用self.xx与_xx来获取到这个属性。但是一直有一个疑惑,那就是这两个之间有...

41616
来自专栏静晴轩

JavaScript对象length

前几日有在Javascript数组操作一文中稍提及了数组的length属性;深入一点探究,就发现JS这length确有许多难为所知的特性。这就边学边探究下这朵奇...

3798
来自专栏十月梦想

计算属性的setter和getter

        刚才通过计算lastName和firstName获取了整个姓名,当时我们只是通过一直的data对象中属性进行合成的,这个也就是计算属性(comp...

2311

扫码关注云+社区

领取腾讯云代金券