Go 语言数值类型和字符串类型之间转换
优质
小牛编辑
153浏览
2023-12-01
Go 语言中不能通过 数据类型(变量)的格式将数值类型转换为字符串,也不能通过,数据类型(变量)的格式将字符串转换为数值类型
package main import "fmt" func main() { var num1 int32 = 65 // 可以将整型强制转换, 但是会按照ASCII码表来转换 // 但是不推荐这样使用 var str1 string = string(num1) fmt.Println(str1) var num2 float32 = 3.14 // 不能将其它基本类型强制转换为字符串类型 var str2 string = string(num2) fmt.Println(str2) var str3 string = "97" // 不能强制转换, cannot convert str2 (type string) to type int var num3 int = int(str3) fmt.Println(num3) }
数值类型转字符串类型 strconv..FormatXxx()
package main import "fmt" func main() { var num1 int32 = 10 // 第一个参数: 需要被转换的整型,必须是int64类型 // 第二个参数: 转换为几进制, 必须在2到36之间 // 将32位十进制整型变量10转换为字符串,并继续保留10进制格式 str1 := strconv.FormatInt(int64(num1), 10) fmt.Println(str1) // 10 // 将32位十进制整型变量10转换为字符串,并转换为2进制格式 str2 := strconv.FormatInt(int64(num1), 2) fmt.Println(str2) // 1010 var num5 float64 = 3.1234567890123456789 // 第一个参数: 需要转换的实型, 必须是float64类型 // 第二个参数: 转换为什么格式,f小数格式, e指数格式 // 第三个参数: 转换之后保留多少位小数, 传入-1按照指定类型有效位保留 // 第四个参数: 被转换数据的实际位数,float32就传32, float64就传64 // 将float64位实型,按照小数格式并保留默认有效位转换为字符串 str3 := strconv.FormatFloat(num5, 'f', -1, 64) fmt.Println(str3) // 3.1234567 str4 := strconv.FormatFloat(num5, 'f', -1, 64) fmt.Println(str4) // 3.1234567890123457 // 将float64位实型,按照小数格式并保留2位有效位转换为字符串 str5 := strconv.FormatFloat(num5, 'f', 2, 64) fmt.Println(str5) // 3.12 // 将float64位实型,按照指数格式并保留2位有效位转换为字符串 str6 := strconv.FormatFloat(num5, 'e', 2, 64) fmt.Println(str6) // 3.12 var num6 bool = true str7 := strconv.FormatBool(num6) fmt.Println(str7) // true }
字符串类型转数值类型 strconv.ParseXxx()
package main import "fmt" func main() { var str1 string = "125" // 第一个参数: 需要转换的数据 // 第二个参数: 转换为几进制 // 第三个参数: 转换为多少位整型 // 注意点: ParseInt函数会返回两个值, 一个是转换后的结果, 一个是错误 // 如果被转换的数据转换之后没有超出指定的范围或者不能被转换时, // 那么错误为nil, 否则错误不为nil // 将字符串"125"转换为10进制的int8 num1, err := strconv.ParseInt(str1, 10, 8) if err != nil { fmt.Println(err) } fmt.Println(num1) var str2 string = "150" // 将字符串"150"转换为10进制的int8 // 由于int8的取值范围是-128~127, 所以转换之后超出了指定的范围, error不为nil num2, err := strconv.ParseInt(str2, 10, 8) if err != nil { fmt.Println(err) } fmt.Println(num2) var str3 string = "3.1234567890123456789" // 第一个参数: 需要转换的数据 // 第二个参数: 转换为多少位小数, 32 or 64 // ParseFloat同样有两个返回值, 如果能够正常转换则错误为nil, 否则不为nil num3, err := strconv.ParseFloat(str3, 32) if err != nil { // 例如: 把字符串"3.14abc"转换为小数就会报错, 因为"3.14abc"不是一个小数 fmt.Println(err) } fmt.Println(num3) var str4 string = "true" // 第一个参数: 需要转换的数据 // ParseBool同样有两个返回值, 如果能够正常转换则错误为nil, 否则不为nil num4, _ := strconv.ParseBool(str4) fmt.Println(num4) }
字符串类型转换为数值类型时,如果不能转换除了返回 error 以外,还会返回对应类型的默认值
package main import "fmt" func main() { var str1 string = "abc" num1, _ := strconv.ParseInt(str1, 10, 32) fmt.Println(num1) // 0 num2, _ := strconv.ParseFloat(str1, 32) fmt.Println(num2) // 0 num3, _ := strconv.ParseBool(str1) fmt.Println(num3) // false }
看完上面的代码有没有种想打人的感觉?如果有那么请继续往下看
字符串类型和整型快速转换
package main import "fmt" func main() { var num1 int32 = 110 // 快速将整型转换为字符串类型 // 注意:Itoa方法只能接受int类型 var str1 string = strconv.Itoa(int(num1)) fmt.Println(str1) var str2 string = "666" // 快速将字符串类型转换为整型 // 注意: Atoi方法返回两个值, 一个值是int,一个值是error // 如果字符串能被转换为int,那么error为nil, 否则不为nil num2, err := strconv.Atoi(str2) if err != nil{ fmt.Println(err) } fmt.Println(num2) }
数值类型转字符串类型其它方式
package main import "fmt" func main() { var num1 int32 = 110 // Sprintf函数和Printf函数很像, 只不过不是输出而将格式化的字符串返回给我们 var str1 string = fmt.Sprintf("%d", num1) fmt.Println(str1) var num2 float32 = 3.14 var str2 string = fmt.Sprintf("%f", num2) fmt.Println(str2) var num3 bool = true var str3 string = fmt.Sprintf("%t", num3) fmt.Println(str3) }