Golang 基本操作(二)string和其他类型的相互转换

将其他值转换为string

第一种,一般常用fmt.Sprintf(格式,转换的值)

// 使用fmt.Sprintf 转换所有的类型为string 使用 这是第一种
    // 注意在sprintf使用中需要注意转换的格式 int为%d float为%f bool为%t byte为%c
    var i int = 20
    var f float64 = 12.456
    var t bool = true
    var b byte = 'a'
    var strs string

    strs = fmt.Sprintf("%d",i)
    fmt.Println(strs)
    fmt.Printf("str type %T ,strs=%v \n",strs,strs)

    strs = fmt.Sprintf("%f",f)
    fmt.Println(strs)
    fmt.Printf("str type %T ,strs=%v \n",strs,strs)

    strs = fmt.Sprintf("%t",t)
    fmt.Println(strs)
    fmt.Printf("str type %T ,strs=%v \n",strs,strs)

    strs = fmt.Sprintf("%c",b)
    fmt.Println(strs)
    fmt.Printf("str type %T ,strs=%v \n",strs,strs)

 

第二种 有局限性  只能单一转换 看源码可知

例如,对于 strconv.Itoa() 源码 只能传递int参数

// Itoa is equivalent to FormatInt(int64(i), 10).
func Itoa(i int) string {
    return FormatInt(int64(i), 10)
}
package main

import (
    "fmt"
    "strconv"
)

func main() {
    var num int = 5000
    nums := strconv.Itoa(num)
    fmt.Println(nums)
    fmt.Printf("\n转换前是 %T, 经过strconv.Itoa转换为 %T, 值为%v",num,nums,nums)
}

 

 

将string转换为其他值

注意:

至于string 转其他类型操作如下 前提是string能转换为其他基本类型  string "123x" 不能转 为 int 123x   强转则为0 但是类型会变为int

相当于没转成功,相当于给你一个int的默认值和变量名 不管转换的变量之前有没有声明

 第一种  strconv.Atoi() 

看源码也能得知只能传递string类型 返回int类型  局限性很大  并且只能将整数字符串转换 入股掺杂一些字母之类的会错误

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var num2 string = "123X"
    // 只能整数的字符串转换 不能掺杂其他不适整数的字符
    nums2,_ := strconv.Atoi(num2)
    fmt.Println(nums2)
    fmt.Printf("转换前是 %T, 经过strconv.Atoi转换为 %T, 值为%v",num2,nums2,nums2)
}

结果为:

>>>
0
转换前是 string, 经过strconv.Atoi转换为 int, 值为0

 

第二种 strconv 包的函数方法

string转int

golang strconv.ParseInt 是将字符串转换为数字的函数

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // string 类型转换为 其他类型
    var str string = "123"
    // strconv.parseint 传入转换的字符串 返回int类型和error
    ing,_ := strconv.ParseInt(str,0,0)
    fmt.Println(ing)
    fmt.Printf("int type %T  %v\n",ing,ing)
}


如果对返回int64位不想要int64的 可以进行一个强制转换为int32 ing = int32(ing)

注意只有同类型才能转换  

同理 下面通过strconv.Parsexxx的也可以通过这个转换为同类型的其他格式 但是需要考虑 范围 比如int64转int32 如果int64返回的值很大,那么强转会出现值不对

 

注意:对于ParseInt函数

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

参数1 数字的字符串形式

参数2 数字字符串的进制 比如二进制 八进制 十进制 十六进制

前两哥参数解释如上,对于第三个参数,在网上很多帖子说,第三个参数 是指定返回值类型的,可能有些歧义

针对函数 返回值 问题,官方文档已经写得很清楚了,就是 多返回值(int64,error)

那么,第三个参数有何用?

其实,他是起到 string 转 int 时的一个限制作用,如果超过了第三个参数 bitSize 的限制,那么就会将报错信息输出到 error 中

 

案例:

我们分别将 “127” 和 “128” 转换成 int类型

package main
 
import (
    "fmt"
    "strconv"
)
 
func main() {
    str1 := "127"
    n, err := strconv.ParseInt(str1, 10, 8) //这里的 8 指的是 转换结果最大值不超过 int8 即 127
    if err != nil {
        fmt.Printf("err is %v\n", err)
    }
    fmt.Printf("类型: %T ,值: %d", n, n)
}
>>>
类型: int64 ,值: 127

 

package main
 
import (
    "fmt"
    "strconv"
)
 
func main() {
    str1 := "128"
    n, err := strconv.ParseInt(str1, 10, 8) //这里的 8 指的是 转换结果最大值不超过 int8 即 127
    if err != nil {
        fmt.Printf("err is %v\n", err)
    }
    fmt.Printf("类型: %T ,值: %d", n, n)
}
>>>
err is strconv.ParseInt: parsing "128": value out of range
类型: int64 ,值: 127

 

 

其他函数如下:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 字符串转为bool类型
    var str1 string = "true"
    b , _ := strconv.ParseBool(str1)
    fmt.Println(b)  //true
    fmt.Printf("%t\n",b)  //true

    // 但有个局限,只能字符串是"true""是才会转换为bool = true类型
    // 其他因为转换不成功所以都是一个bool默认值  false
    str1 = "truez"
    b , _ = strconv.ParseBool(str1)
    fmt.Println(b) //false
    fmt.Printf("%t\n",b) //false



    // string转float

    var floatstr string = "123.456"
    floats,_ := strconv.ParseFloat(floatstr,64)

    //返回float64 可以强转为float32  但是注意float64位的值大小,如果超过float32位 请不要转换
    fmt.Println(floats) //123.456
    fmt.Printf("str类型为 %T ,值为 %v ,浮点值为 %f" ,floats,floats,floats)
    // str类型为 float64 ,值为 123.456 ,浮点值为 123.456000
}

 

posted @ 2021-12-21 21:05  r1-12king  阅读(853)  评论(0编辑  收藏  举报