简单的转换操作
在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:
valueOfTypeB = typeB(valueOfTypeA)
类型转换只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(将 int16 转换为 int32)。当从一个取值范围较大的类型转换到取值范围较小的类型时(将 int32 转换为 int16 或将 float32 转换为 int),会发生精度丢失(截断)的情况。
实例
以下实例中将整型转化为浮点型,并计算结果,将结果赋值给浮点型变量:
var sum int = 17
var count int = 5
var mean float32
mean = float32(sum)/float32(count)
fmt.Printf("mean 的值为: %fn",mean)
只有相同底层类型的变量之间可以进行相互转换(如将 int16 类型转换成 int32 类型),不同底层类型的变量相互转换时会引发编译错误(如将 bool 类型转换为 int 类型)
Sprintf
fmt的sprintf方法也提供了一些简单的将其他数据类型转为string类型的操作
注意:sprintf 使用中需要注意转换的格式 int 为%d float 为%f bool 为%t byte 为%c
- int转成string:
var i int = 20
strs = fmt.Sprintf("%d", i)
- byte转string:
var b byte = 'a'
strs = fmt.Sprintf("%c", b)
- bool转string:
var t bool = true
strs = fmt.Sprintf("%t", t)
- float64转string:
var f float64 = 12.456
strs = fmt.Sprintf("%f", f)
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()
还有其他一些基本用不上的函数,见官方手册:https://golang.org/pkg/strconv/。
当有些类型无法转换时,将报错,返回的错误是strconv包中自行定义的error类型。有两种错误: var ErrRange = errors.New("value out of range") var ErrSyntax = errors.New("invalid syntax")
例如,使用Atoi("a")将"a"转换为int类型,自然是不成功的。如果print输出err信息,将显示:
strconv.Atoi: parsing "a": invalid syntax
Format类函数
将给定类型格式化为string类型:FormatBool()、FormatFloat()、FormatInt()、FormatUint()。
- int 转换成 string
var num1 int = 20
s1 := strconv.Itoa(num1)
fmt.Printf("str type %T ,strs=%v \n", s1, s1)
- int64转成string
var num2 int64 = 200
s2 := strconv.FormatInt(num2, 10)
fmt.Printf("str type %T ,strs=%v \n", s2, s2)
- float 转 string
/*
参数 1:要转换的值
参数 2:格式化类型
'f'(-ddd.dddd)、
'b'(-ddddp±ddd,指数为二进制)、
'e'(-d.dddde±dd,十进制指数)、
'E'(-d.ddddE±dd,十进制指数)、
'g'(指数很大时用'e'格式,否则'f'格式)、
'G'(指数很大时用'E'格式,否则'f'格式)。
参数 3: 保留的小数点 -1(不对小数点格式化)
参数 4:格式化的类型
*/
var num3 float64 = 20.113123
s2 := strconv.FormatFloat(num2,'f',6,64)
fmt.Printf("str type %T ,strs=%v \n", s2, s2)
- bool 转 string
s4 := strconv.FormatBool(true)
fmt.Printf("str type %T ,strs=%v \n", s4, s4)
Parse类函数
Parse类函数用于转换字符串为给定类型的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。
由于字符串转换为其它类型可能会失败,所以这些函数都有两个返回值,第一个返回值保存转换后的值,第二个返回值判断是否转换成功。
string转成int:
int, err := strconv.Atoi(string)
string转成int64:
int64, err := strconv.ParseInt(string, 10, 64)
string转成uint64:
uint64, err := strconv.ParseUint(string, 10, 64)
Append类函数
AppendTP类函数用于将TP转换成字符串后append到一个slice中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()。
Append类的函数和Format类的函数工作方式类似,只不过是将转换后的结果追加到一个slice中。
// 声明一个slice
b10 := []byte("int (base 10):")
// 将转换为10进制的string,追加到slice中
b10 = strconv.AppendInt(b10, -42, 10)
fmt.Println(string(b10))
b16 := []byte("int (base 16):")
b16 = strconv.AppendInt(b16, -42, 16)
fmt.Println(string(b16))
参考:
https://blog.csdn.net/m0_38132420/article/details/78196933
https://www.cnblogs.com/shuiyuejiangnan/p/9707066.html