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 }