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转其它类型可能会失败,所以这些函数都有第二个返回值表示是否转换成功
  • FormatTP类函数将其它类型转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. // func Itoa(i int) string
  2. // Itoa等效于FormatInt(int64(i),10)。int型转换为字符串
  3. iItoa := 10
  4. sItoa := strconv.Itoa(iItoa)
  5. fmt.Printf("%T,%v\n", sItoa, sItoa) //string,10
  6. // Itoa(): int -> string
  7. println("a" + strconv.Itoa(32)) // a32

2.string转换为int:Atoi()

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

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

  1. // func Atoi(s string) (int,error)
  2. // Atoi等效于ParseInt(s,10,0),转换为int类型。
  3. vAtoi := "10"
  4. if s, err := strconv.Atoi(vAtoi); err == nil {
  5. fmt.Printf("%T,%v\n", s, s) //int,10
  6. }
  7. // Atoi(): string -> int
  8. i,_ := strconv.Atoi("3")
  9. println(3 + i) // 6
  10. // Atoi()转换失败
  11. i,err := strconv.Atoi("a")
  12. if err != nil {
  13. println("converted failed")
  14. }

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)
  • 将字符串解析为整数,ParseInt 支持正负号,ParseUint 不支持正负号。
  • base 表示进位制(2 到 36),如果 base 为 0,则根据字符串前缀判断,
  • 前缀 0x 表示 16 进制,前缀 0 表示 8 进制,否则是 10 进制。
  • bitSize 表示结果的位宽(包括符号位),0 表示最大位宽。

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。

FormatBool()

  1. // 将布尔值转换为字符串 true 或 false
  2. func FormatBool(b bool) string
  3. // 将字符串转换为布尔值
  4. // 它接受真值:1, t, T, TRUE, true, True
  5. // 它接受假值:0, f, F, FALSE, false, False
  6. // 其它任何值都返回一个错误。
  7. func ParseBool(str string) (bool, error)

FormatFloat()参数众多:

  1. func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  • f:要转换的浮点数
  • fmt表示格式:
    • ‘f’(-ddd.dddd)
    • ‘b’(-ddddp±ddd,指数为二进制)
    • ‘e’(-d.dddde±dd,十进制指数)
    • ‘E’(-d.ddddE±dd,十进制指数)
    • ‘g’(指数很大时用’e’格式,否则’f’格式)
    • ‘G’(指数很大时用’E’格式,否则’f’格式)。
  • prec控制精度(排除指数部分):
    • 对’f’、’e’、’E’,则prec 表示小数点后的数字个数;
    • 对’g’、’G’,则 prec 表示总的数字位数(整数部分+小数部分);
    • 如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f。
  • bitSize表示f的来源类型(32:float32、64:float64),会据此进行舍入。

// 将字符串解析为浮点数,使用 IEEE754 规范进行舍入。
// bigSize 取值有 32 和 64 两种,表示转换结果的精度。
// 如果有语法错误,则 err.Error = ErrSyntax
// 如果结果超出范围,则返回 ±Inf,err.Error = ErrRange

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

Quote类函数

  1. // 将 s 转换为双引号字符串
  2. func Quote(s string) string
  3. // 功能同上,非 ASCII 字符和不可打印字符会被转义
  4. func QuoteToASCII(s string) string
  5. // 功能同上,非图形字符会被转义
  6. func QuoteToGraphic(s string) string
  7. ------------------------------
  8. // 示例
  9. func main() {
  10. s := "Hello\t世界!\n"
  11. fmt.Println(s) // Hello 世界!(换行)
  12. fmt.Println(strconv.Quote(s)) // "Hello\t世界!\n"
  13. fmt.Println(strconv.QuoteToASCII(s)) // "Hello\t\u4e16\u754c\uff01\n"
  14. fmt.Println(strconv.QuoteToGraphic(s)) // "Hello\t世界!\n"
  15. }
  16. ------------------------------
  17. // 将 r 转换为单引号字符
  18. func QuoteRune(r rune) string
  19. // 功能同上,非 ASCII 字符和不可打印字符会被转义
  20. func QuoteRuneToASCII(r rune) string
  21. // 功能同上,非图形字符会被转义
  22. func QuoteRuneToGraphic(r rune) string
  23. ------------------------------
  24. // Unquote 将“带引号的字符串” s 转换为常规的字符串(不带引号和转义字符)
  25. // s 可以是“单引号”、“双引号”或“反引号”引起来的字符串(包括引号本身)
  26. // 如果 s 是单引号引起来的字符串,则返回该该字符串代表的字符
  27. func Unquote(s string) (string, error)
  28. // UnquoteChar 将带引号字符串(不包含首尾的引号)中的第一个字符“取消转义”并解码
  29. //
  30. // s :带引号字符串(不包含首尾的引号)
  31. // quote:字符串使用的“引号符”(用于对字符串中的引号符“取消转义”)
  32. //
  33. // value :解码后的字符
  34. // multibyte:value 是否为多字节字符
  35. // tail :字符串 s 解码后的剩余部分
  36. // error :返回 s 中是否存在语法错误
  37. //
  38. // 参数 quote 为“引号符”
  39. // 如果设置为单引号,则 s 中允许出现 \'、" 字符,不允许出现单独的 ' 字符
  40. // 如果设置为双引号,则 s 中允许出现 \"、' 字符,不允许出现单独的 " 字符
  41. // 如果设置为 0,则不允许出现 \' 或 \" 字符,但可以出现单独的 ' 或 " 字符
  42. func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)
  43. ------------------------------
  44. // 示例
  45. func main() {
  46. s1 := "`Hello 世界!`" // 解析反引号字符串
  47. s2 := `"Hello\t\u4e16\u754c\uff01"` // 解析双引号字符串
  48. fmt.Println(strconv.Unquote(s1)) // Hello 世界! <nil>
  49. fmt.Println(strconv.Unquote(s2)) // Hello 世界! <nil>
  50. fmt.Println()
  51. fmt.Println(strconv.UnquoteChar(`\u4e16\u754c\uff01`, 0))
  52. // 19990 true \u754c\uff01 <nil>
  53. fmt.Println(strconv.UnquoteChar(`\"abc\"`, '"'))
  54. // 34 false abc\" <nil>
  55. }

官网示例

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. )
  7. func main() {
  8. // 1.func AppendBool
  9. //func AppendBool(dst []byte, b bool) []byte
  10. // AppendBool根据b的值将“ true”或“ false”追加到dst并返回扩展缓冲区。
  11. b := []byte("bool:")
  12. b = strconv.AppendBool(b, true)
  13. fmt.Println(string(b))
  14. //bool:true
  15. // 2. func AppendFloat
  16. // func AppendFloat(dst []byte,f float64, fmt byte, prec, bitSize int) []byte
  17. // AppendFloat将由FormatFloat生成的浮点数f的字符串形式附加到dst,并返回扩展缓冲区。
  18. b32 := []byte("float32:")
  19. b32 = strconv.AppendFloat(b32, 3.1415926535, 'E', -1, 32)
  20. fmt.Println(string(b32)) //float32:3.1415927E+00
  21. b64 := []byte("float64:")
  22. b64 = strconv.AppendFloat(b64, 3.1415926535, 'E', -1, 64)
  23. fmt.Println(string(b64)) // float64:3.1415926535E+00
  24. // 3. func AppendInt
  25. // func AppendInt(dst []byte, i int64, base int) []byte
  26. // AppendInt将由FormatInt生成的整数i的字符串形式附加到dst,并返回扩展缓冲区。
  27. b10 := []byte("int (byte 10):")
  28. b10 = strconv.AppendInt(b10, -42, 10)
  29. fmt.Println(string(b10)) // int (byte 10):-42
  30. b16 := []byte("int (byte 16):")
  31. b16 = strconv.AppendInt(b16, -42, 16)
  32. fmt.Println(string(b16)) // int (byte 16):-2a
  33. // 4. func AppendUint
  34. // func AppendUint(dst []byte,i uint64, base int) []byte
  35. // AppendUint将由FormatUint生成的无符号整数i的字符串形式附加到dst,然后返回扩展缓冲区。
  36. bUint10 := []byte("uint (base10):")
  37. bUint10 = strconv.AppendUint(bUint10, 42, 10)
  38. fmt.Println(string(bUint10)) //uint (base10):42
  39. bUint16 := []byte("uint (base16):")
  40. bUint16 = strconv.AppendUint(bUint16, 42, 10)
  41. fmt.Println(string(bUint16)) //uint (base16):42
  42. // 5. func AppendQuote
  43. // func AppendQuote(dst []byte, s string) []byte
  44. // AppendQuote将由Quote生成的表示s的双引号Go字符串文字附加到dst并返回扩展缓冲区。
  45. bQuote := []byte("quote:")
  46. bQuote = strconv.AppendQuote(bQuote, `"Fran & Freddie's Diner"`)
  47. fmt.Println(string(bQuote)) // quote:"\"Fran & Freddie's Diner\""
  48. // 6. func AppendQuoteRune
  49. // func AppendQuoteRune(dst []byte, r rune) []byte
  50. // AppendQuoteRune将由QuoteRune生成的表示rune的单引号Go字符文字附加到dst,并返回扩展缓冲区。
  51. bQuoteRune := []byte("rune:")
  52. bQuoteRune = strconv.AppendQuoteRune(bQuoteRune, '😊')
  53. fmt.Println(string(bQuoteRune)) //rune:'😊'
  54. // 7. func AppendQuoteRuneToASCII
  55. // func AppendQuoteRuneToASCII(dst []byte,r rune) []byte
  56. // AppendQuoteRuneToASCII将由QuoteRuneToASCII生成的表示rune的单引号Go字符文字附加到dst,并返回扩展缓冲区。
  57. bQuoteRuneToASCII := []byte("rune(ascii):")
  58. bQuoteRuneToASCII = strconv.AppendQuoteRuneToASCII(bQuoteRuneToASCII, '☺')
  59. fmt.Println(string(bQuoteRuneToASCII)) //rune(ascii):'\u263a'
  60. // 8. func AppendQuoteRuneToGraphic
  61. // func AppendQuoteToGraphic(dst []byte, r rune) []byte
  62. // AppendQuoteToGraphic将由QuoteToGraphic生成的表示s的双引号Go字符串文字附加到dst,并返回扩展缓冲区。
  63. // 9. func AppendQuoteToASCII
  64. // func AppendQuoteToASCII(dst []byte, s string) []byte
  65. bQuoteToASCII := []byte("quote (ascii):")
  66. bQuoteToASCII = strconv.AppendQuoteToASCII(bQuoteToASCII, `"Fran & Freddie's Diner"`)
  67. fmt.Println(string(bQuoteToASCII)) //quote (ascii):"\"Fran & Freddie's Diner\""
  68. // 10. func AppendQuoteToGraphic
  69. // func AppendQuoteToGraphic(dst []byte, s string) []byte
  70. // AppendQuoteToGraphic将由QuoteToGraphic生成的表示s的双引号Go字符串文字附加到dst,并返回扩展缓冲区。
  71. // 11. func Atoi
  72. // func Atoi(s string) (int,error)
  73. // Atoi等效于ParseInt(s,10,0),转换为int类型。
  74. vAtoi := "10"
  75. if s, err := strconv.Atoi(vAtoi); err == nil {
  76. fmt.Printf("%T,%v\n", s, s) //int,10
  77. }
  78. // 12. func CanBackquote
  79. // func CanBackquote(s string) bool
  80. // CanBackquote报告字符串s是否可以不变地表示为单行反引号字符串,且没有制表符以外的控制字符
  81. fmt.Println(strconv.CanBackquote("Fran & Freddie's Diner ☺")) //true
  82. fmt.Println(strconv.CanBackquote("`can't backquote this`")) //false
  83. // 13. func FormatBool
  84. // func FormatBool(b bool) string
  85. // FormatBool根据b的值返回“ true”或“ false”。
  86. vFormatBool := true
  87. sFormatBool := strconv.FormatBool(vFormatBool)
  88. fmt.Printf("%T,%v\n", sFormatBool, sFormatBool)
  89. // 14. func FormatComplex
  90. // func FormatComplex(c complex128, fmt byte, prec, bitSize int) string
  91. // FormatComplex将复数c转换为(a + bi)形式的字符串,其中a和b是实部和虚部,并根据格式fmt和precision prec进行格式化。
  92. // 格式fmt和precision prec具有与FormatFloat中相同的含义。假设原始结果是从bitSize位的复数值获得的,则对结果进行四舍五入,对于bit64,复数必须为64,而对于128为复数,则必须为128。
  93. // 15. func FormatFloat
  94. // func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  95. // FormatFloat根据fmt和precision prec格式将浮点数f转换为字符串。假设原始结果是从bitSize位的浮点值(float32为32,float64为64)获得的,则对结果进行四舍五入。
  96. //格式fmt是'b'(-ddddp±ddd,二进制指数),'e'(-d.dddde±dd,十进制指数),'E'(-d.ddddE±dd,十进制指数)之一),'f'(-ddd.dddd,无指数),'g'(大指数为'e',否则为'f'),'G'(大指数为'E',否则为'f'),' x'(-0xd.ddddp±ddd,十六进制分数和二进制指数)或'X'(-0Xd.ddddP±ddd,十六进制分数和二进制指数)。
  97. //精度精度控制以“ e”,“ E”,“ f”,“ g”,“ G”,“ x”和“ X”格式打印的位数(不包括指数)。对于“ e”,“ E”,“ f”,“ x”和“ X”,它是小数点后的位数。对于“ g”和“ G”,它是有效数字的最大数量(删除零位)。特殊精度-1使用必要的最小位数,以使ParseFloat准确返回f。
  98. vFloat := 3.1415926535
  99. sFloat32 := strconv.FormatFloat(vFloat, 'E', -1, 32)
  100. fmt.Printf("%T,%v\n", sFloat32, sFloat32) // string,3.1415927E+00
  101. sFloat64 := strconv.FormatFloat(vFloat, 'E', -1, 64)
  102. fmt.Printf("%T,%v\n", sFloat64, sFloat64) // string,3.1415926535E+00
  103. // 16. func FormInt
  104. // func FormatInt(i int64,base int) string
  105. // FormatInt返回给定基数i的字符串表示形式,表示2 <= base <=36。结果使用小写字母'a'到'z'表示数字值> = 10。
  106. vInt := int64(-42)
  107. sInt10 := strconv.FormatInt(vInt, 10)
  108. fmt.Printf("%T,%v\n", sInt10, sInt10) //string,-42
  109. sInt16 := strconv.FormatInt(vInt, 16)
  110. fmt.Printf("%T,%v\n", sInt16, sInt16) //string,-2a
  111. // 17. func FormatUint
  112. // func FormatUint(i uint64, base int) string
  113. // FormatUint以2 <= base <= 36的形式返回给定基数i的字符串表示形式。结果使用小写字母'a'到'z'表示数字值> = 10。
  114. vUint := uint64(42)
  115. sUint10 := strconv.FormatUint(vUint, 10)
  116. fmt.Printf("%T,%v\n", sUint10, sUint10) //string,42
  117. sUint16 := strconv.FormatUint(vUint, 16)
  118. fmt.Printf("%T,%v\n", sUint16, sUint16) //string,2a
  119. // 18. func IsGraphic
  120. // func IsGraphic(r rune) bool
  121. // IsGraphic报告是否通过Unicode将符文定义为“图形”。此类字符包括字母,标记,数字,标点符号,符号和空格,来自类别L,M,N,P,S和Zs。
  122. shamrock := strconv.IsGraphic('☘')
  123. fmt.Println(shamrock) // true
  124. aIsGraphic := strconv.IsGraphic('a')
  125. fmt.Println(aIsGraphic) // true
  126. bel := strconv.IsGraphic('\007')
  127. fmt.Println(bel) // false
  128. // 19. func IsPrint
  129. // func IsPrint(r rune) bool
  130. // IsPrint报告符文是否定义为Go可打印的符文,其定义与unicode.IsPrint:字母,数字,标点符号,符号和ASCII空间。
  131. cIsPrint := strconv.IsPrint('\u263a')
  132. fmt.Println(cIsPrint) // true
  133. belIsPrint := strconv.IsPrint('\007')
  134. fmt.Println(belIsPrint) // false
  135. // 20. func Itoa
  136. // func Itoa(i int) string
  137. // Itoa等效于FormatInt(int64(i),10)。int型转换为字符串
  138. iItoa := 10
  139. sItoa := strconv.Itoa(iItoa)
  140. fmt.Printf("%T,%v\n", sItoa, sItoa) //string,10
  141. // 21. func ParseBool
  142. // func ParseBool(str string) (bool,error)
  143. // ParseBool返回由字符串表示的布尔值。它接受1,t,T,TRUE,true,True,0,f,F,FALSE,false,False。其他任何值都将返回错误。
  144. vParseBool := "true" //bool,true
  145. //vParseBool := "2" //strconv.ParseBool: parsing "2": invalid syntax
  146. if sParseBool, err := strconv.ParseBool(vParseBool); err == nil {
  147. fmt.Printf("%T,%v\n", sParseBool, sParseBool)
  148. } else {
  149. fmt.Println(err)
  150. }
  151. // 22. func ParseComplex
  152. // func ParseComplex(s string,bitSize int) (complex128, error)
  153. // ParseComplex用bitSize指定的精度将字符串s转换为复数:complex64为64,complex128为128。当bitSize = 64时,结果仍然具有complex128类型,但是可以将其转换为complex64而无需更改其值。
  154. //
  155. // s表示的数字必须采用N,Ni或N±Ni的形式,其中N代表ParseFloat识别的浮点数,而i是虚部。如果第二个N是无符号的,则在两个分量之间需要一个+号,如±所示。如果第二个N为NaN,则仅接受+号。表格可以用括号括起来,不能包含任何空格。生成的复数由ParseFloat转换的两个组件组成。
  156. //
  157. // ParseComplex返回的错误的具体类型为* NumError,其中包括err.Num = s。
  158. //
  159. // 如果s在语法上不正确,则ParseComplex返回err.Err = ErrSyntax。
  160. //
  161. // 如果s的语法格式正确,但是任一组件距离给定组件大小的最大浮点数均超过1/2 ULP,则ParseComplex返回err.Err = ErrRange,c =±Inf。
  162. // 22. func ParseFloat
  163. // func ParseFloat(s string, bitSize int) (float64,error)
  164. // ParseFloat使用bitSize指定的精度将字符串s转换为浮点数:float32为32或float64为64。当bitSize = 32时,结果仍为float64类型,但可以将其转换为float32而无需更改其值。
  165. //
  166. // ParseFloat接受十进制和十六进制浮点数语法。如果s格式正确且在有效的浮点数附近,则ParseFloat返回使用IEEE754无偏舍入舍入的最接近的浮点数。(仅当十六进制表示中的位数比尾数可容纳的位数多时,才对舍入十六进制浮点值进行四舍五入。)
  167. //
  168. // ParseFloat返回的错误的具体类型为* NumError,其中包括err.Num = s。
  169. //
  170. // 如果s在语法上不正确,则ParseFloat返回err.Err = ErrSyntax。
  171. //
  172. // 如果s的语法格式正确,但与给定大小的最大浮点数相差超过1/2 ULP,则ParseFloat返回f =±Inf,err.Err = ErrRange。
  173. //
  174. // ParseFloat将字符串“ NaN”以及(可能带有符号的)字符串“ Inf”和“ Infinity”识别为它们各自的特殊浮点值。匹配时忽略大小写。
  175. vParseFloat := "3.1415926535"
  176. if s, err := strconv.ParseFloat(vParseFloat, 32); err == nil {
  177. fmt.Printf("%T,%v\n", s, s)
  178. }
  179. if s, err := strconv.ParseFloat(vParseFloat, 64); err == nil {
  180. fmt.Printf("%T,%v\n", s, s)
  181. }
  182. if s, err := strconv.ParseFloat("NaN", 32); err == nil {
  183. fmt.Printf("%T,%v\n", s, s)
  184. }
  185. // ParseFloat is case insensitive
  186. if s, err := strconv.ParseFloat("nan", 32); err == nil {
  187. fmt.Printf("%T, %v\n", s, s)
  188. }
  189. if s, err := strconv.ParseFloat("inf", 32); err == nil {
  190. fmt.Printf("%T, %v\n", s, s)
  191. }
  192. if s, err := strconv.ParseFloat("+Inf", 32); err == nil {
  193. fmt.Printf("%T, %v\n", s, s)
  194. }
  195. if s, err := strconv.ParseFloat("-Inf", 32); err == nil {
  196. fmt.Printf("%T, %v\n", s, s)
  197. }
  198. if s, err := strconv.ParseFloat("-0", 32); err == nil {
  199. fmt.Printf("%T, %v\n", s, s) //float64, -0
  200. }
  201. if s, err := strconv.ParseFloat("+0", 32); err == nil {
  202. fmt.Printf("%T, %v\n", s, s) //float64, 0
  203. }
  204. // 23. func ParseInt
  205. // func ParseInt(s string, base int, bitSize int) (i int64, err error)
  206. // ParseInt解析给定基数(0、2到36)和位大小(0到64)中的字符串s,并返回对应的值i。
  207. //
  208. //如果base参数为0,则字符串的前缀隐含真实的基数:“ 0b”为2,“ 0”或“ 0o”为8,“ 0x”为16,否则为10。此外,仅对于参数基数0,如Go语法所定义的整数文字一样,允许使用下划线字符。
  209. //
  210. //bitSize参数指定结果必须适合的整数类型。位大小0、8、16、32和64分别对应于int,int8,int16,int32和int64。如果bitSize小于0或大于64,则返回错误。
  211. //
  212. //ParseInt返回的错误的具体类型为* NumError,其中包括err.Num = s。如果s为空或包含无效数字,则err.Err = ErrSyntax,返回值为0;否则,返回0。如果与s对应的值不能用给定大小的有符号整数表示,则err.Err = ErrRange,并且返回的值是适当的bitSize和sign的最大大小整数。
  213. vParseInt32 := "-354634382"
  214. if s, err := strconv.ParseInt(vParseInt32, 10, 32); err == nil {
  215. fmt.Printf("%T, %v\n", s, s) //int64, -354634382
  216. }
  217. if s, err := strconv.ParseInt(vParseInt32, 16, 32); err == nil {
  218. fmt.Printf("%T, %v\n", s, s)
  219. } else {
  220. fmt.Println(err) //strconv.ParseInt: parsing "-354634382": value out of range
  221. }
  222. vParseInt64 := "-3546343826724305832"
  223. if s, err := strconv.ParseInt(vParseInt64, 10, 64); err == nil {
  224. fmt.Printf("%T, %v\n", s, s) //int64, -3546343826724305832
  225. }
  226. if s, err := strconv.ParseInt(vParseInt64, 16, 64); err == nil {
  227. fmt.Printf("%T, %v\n", s, s)
  228. } else {
  229. fmt.Println(err) //strconv.ParseInt: parsing "-3546343826724305832": value out of range
  230. }
  231. // 24. func ParseUint
  232. // func ParseUint(s string, base int, bitSize int) (uint64,error)
  233. // ParseUint类似于ParseInt,但用于无符号数字。
  234. vParseUint := "42"
  235. if s, err := strconv.ParseUint(vParseUint, 10, 32); err == nil {
  236. fmt.Printf("%T,%v\n", s, s) //uint64,42
  237. }
  238. if s, err := strconv.ParseUint(vParseUint, 10, 64); err == nil {
  239. fmt.Printf("%T,%v\n", s, s) //uint64,42
  240. }
  241. // 25. func Quote
  242. // func Quote(s string) string
  243. // Quote返回表示s的双引号Go字符串文字。返回的字符串使用Go转义序列(\ t,\ n,\ xFF,\ u0100)来控制字符和IsPrint定义的不可打印字符。
  244. sQuote := strconv.Quote(`"Fran & Freddie's Diner ☺"`)
  245. fmt.Println(sQuote) //"\"Fran & Freddie's Diner\t☺\""
  246. // 26. func QuoteRune
  247. // func Quote(r rune) string
  248. // QuoteRune返回表示符文的单引号Go字符文字。返回的字符串使用Go转义序列(\ t,\ n,\ xFF,\ u0100)来控制字符和IsPrint定义的不可打印字符。
  249. sQuoteRune := strconv.QuoteRune('☺')
  250. fmt.Println(sQuoteRune) //'☺'
  251. // 27. func QuoteRuneToASCII
  252. // func QuoteRuneToASCII(r rune) string
  253. // QuoteRuneToASCII返回表示符文的单引号Go字符文字。返回的字符串对IsASCII定义的非ASCII字符和不可打印的字符使用Go转义序列(\ t,\ n,\ xFF,\ u0100)。
  254. sQuoteRuneToASCII := strconv.QuoteRuneToASCII('☺')
  255. fmt.Println(sQuoteRuneToASCII) //'☺'
  256. // 28. func QuoteRuneToGraphic
  257. // func QuoteRuneToGraphic(r rune) string
  258. // QuoteRuneToGraphic返回表示符文的单引号Go字符文字。如果符文不是IsGraphic定义的Unicode图形字符,则返回的字符串将使用Go转义序列(\ t,\ n,\ xFF,\ u0100)。
  259. sQuoteRuneToGraphic := strconv.QuoteRuneToGraphic('☺')
  260. fmt.Println(sQuoteRuneToGraphic) // '☺'
  261. sQuoteRuneToGraphic = strconv.QuoteRuneToGraphic('\u263a')
  262. fmt.Println(sQuoteRuneToGraphic) // '☺'
  263. sQuoteRuneToGraphic = strconv.QuoteRuneToGraphic('\u000a')
  264. fmt.Println(sQuoteRuneToGraphic) // '\n'
  265. sQuoteRuneToGraphic = strconv.QuoteRuneToGraphic(' ') // tab character
  266. fmt.Println(sQuoteRuneToGraphic) // '\t'
  267. // 29. func QuoteToASCII
  268. // func QuoteToASCII(s string) string
  269. // QuoteToASCII返回表示s的双引号Go字符串文字。返回的字符串对IsASCII定义的非ASCII字符和不可打印的字符使用Go转义序列(\ t,\ n,\ xFF,\ u0100)。
  270. sQuoteToASCII := strconv.QuoteToASCII(`"Fran & Freddie's Diner ☺"`)
  271. fmt.Println(sQuoteToASCII) // "\"Fran & Freddie's Diner\t\u263a\""
  272. // 30. func QuoteToGraphic
  273. // func QuoteToGraphic(s string) string
  274. // QuoteToGraphic返回表示s的双引号Go字符串文字。返回的字符串保留IsGraphic定义的Unicode图形字符不变,并且对非图形字符使用Go转义序列(\ t,\ n,\ xFF,\ u0100)。
  275. sQuoteToGraphic := strconv.QuoteToGraphic("☺")
  276. fmt.Println(sQuoteToGraphic) // "☺"
  277. // This string literal contains a tab character.
  278. sQuoteToGraphic = strconv.QuoteToGraphic("This is a \u263a \u000a")
  279. fmt.Println(sQuoteToGraphic) // "This is a ☺\t\n"
  280. sQuoteToGraphic = strconv.QuoteToGraphic(`" This is a ☺ \n "`)
  281. fmt.Println(sQuoteToGraphic) // "\" This is a ☺ \\n \""
  282. // 31. func Unquote
  283. // func Unquote(s string) (string error)
  284. // Unquote将s解释为单引号,双引号或反引号的Go字符串文字,并返回s引用的字符串值。(如果s是单引号,则它将是Go字符文字; Unquote返回相应的单字符字符串。)
  285. sUnquote, err := strconv.Unquote("You can't unquote a string without quotes")
  286. fmt.Printf("%q, %v\n", sUnquote, err) // "", invalid syntax
  287. sUnquote, err = strconv.Unquote("\"The string must be either double-quoted\"")
  288. fmt.Printf("%q, %v\n", sUnquote, err) // "The string must be either double-quoted", <nil>
  289. sUnquote, err = strconv.Unquote("`or backquoted.`")
  290. fmt.Printf("%q, %v\n", sUnquote, err) // "or backquoted.", <nil>
  291. sUnquote, err = strconv.Unquote("'\u263a'") // single character only allowed in single quotes
  292. fmt.Printf("%q, %v\n", sUnquote, err) // "☺", <nil>
  293. sUnquote, err = strconv.Unquote("'\u2639\u2639'")
  294. fmt.Printf("%q, %v\n", sUnquote, err) // "", invalid syntax
  295. // 32. func UnquoteChar
  296. // func UnquoteChar(s string,quote byte) (value rune, multibyte bool, tail string,err error)
  297. // UnquoteChar解码转义的字符串或由字符串s表示的字符文字中的第一个字符或字节。它返回四个值:
  298. // 1)值,即解码后的Unicode代码点或字节值;
  299. // 2)多字节,一个布尔值,指示解码的字符是否需要多字节UTF-8表示形式;
  300. // 3)尾部,字符串后字符的其余部分;和
  301. // 4)如果字符在语法上有效,则错误将为nil。
  302. // 第二个参数quote指定要解析的文字的类型,因此允许使用转义的引号字符。如果设置为单引号,则允许使用序列\'并禁止未转义的'。如果设置为双引号,则允许使用“”,而不允许使用不转义的“。如果设置为零,则不允许任何转义,并且两个引号字符都显示为不转义。
  303. vUnquoteChar, mbUnquoteChar, tUnquoteChar, err := strconv.UnquoteChar(`\"Fran & Freddie's Diner\"`, '"')
  304. if err != nil {
  305. log.Fatal(err)
  306. }
  307. fmt.Println("value:", string(vUnquoteChar)) // value: "
  308. fmt.Println("multibyte:", mbUnquoteChar) // multibyte: false
  309. fmt.Println("tail:", tUnquoteChar) // tail: Fran & Freddie's Diner\"
  310. // 33. func (*NumError) Error
  311. // func (e *NumError) Error() string
  312. // 34. func (*NumError) Unwrap
  313. // func (e *NumError) Unwrap() error
  314. // 33. typeNumError
  315. }

参考:
https://www.cnblogs.com/f-ck-need-u/p/9863915.html
https://www.cnblogs.com/golove/p/3262925.html
https://golang.org/pkg/strconv/#example_AppendQuoteRuneToASCII