基本数据类型的转换:
Golang不同类型变量之间赋值时需要显式转换(强制转换),Goalng数据类型不能自动转换!
转换方法:类似python,沟通过T(v)函数方式来转换。
示例如下
package main
import "fmt"
func main() {
//尝试使用 i = float32(i)不可行,必须要重新定义变量
var i int = 100
var i1 float32 = float32(i)
fmt.Printf("i1=%v\n",i1)
fmt.Printf("i的类型为:%T\n",i) //int
fmt.Printf("i1的类型为:%T",i1) //float32
}
示例说明:
-
范围大变成范围小,范围小变成范围大的都可以,int8变int16,int16变成int8都可以。
-
数据转换类型考点:通过转换只是把i的值转换为指定类型赋予i1,而i本身数据类型并未改变;
被转换的是变量存储的数值,变量本身数据类型并未发生变化。 -
在转换中,如果int64转换成int8,编译不会报错,但是转换结果会按照二进制溢出处理,结果肯定不一致,所以不要强转数据类型。
-
两个例子深刻理解数据类型:
//数据转换类型不可以交叉赋不通数据类型的值,例如int32赋值给int64,这个肯定不可以,必须把int32变量值转换为int64
var ( n1 int32 n2 int64 n3 int8 ) n1 = 32 n2 = int64(n1) + 10 n3 = int8(n2) + 10 fmt.Printf("%d %d %d",n1,n2,n3)
//符合intxx类型但是不符合数值范围,编译不会报错,但是数值会溢出;上来赋值不符合数值范围的数值,编译直接报错,没有然后了
//编译直接无法通过,n5数据溢出,n6本身+128就不能赋值给n6var ( n4 int8 n5 int8 n6 int8 ) n4 = 10 n5 = int8(n4) + 127 n6 = int8(n4) + 128 fmt.Printf("%d %d %d",n4,n5,n6)
★基本数据类型与string类型互相转化
-
程序开发中经常需要string与其他类型互转。
-
基本类型转string:
(1)fmt.Sprintf():Sprintf根据format参数生成格式化的字符串并返回该字符串。(2)strconv():
func FormatBool(b bool) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string举例说明两种转换方式代码:
package main import ( "fmt" "strconv" ) func main() { //第一种方式,使用fmt.Sprintf()函数来转 num1,num2,bo,char := 90,20.5,true,"b" var str,str1,str2,str3 string str = fmt.Sprintf("%d\n",num1) str1 = fmt.Sprintf("%f\n",num2) str2 = fmt.Sprintf("%t\n",bo) str3 = fmt.Sprintf("%v\n",char) fmt.Println(str,str1,str2,str3) /*第二种方式,使用package strconv: func FormatBool(b bool) string func FormatInt(i int64, base int) string func FormatUint(i uint64, base int) string func FormatFloat(f float64, fmt byte, prec, bitSize int) string */ var str4,str5,str6 string num3,num4,bo1 := 99,13.56,true //参数1:必须为int64, 参数2:多少进制 str4 = strconv.FormatInt(int64(num3),10) //参数1:必须为float64,参数2:f是正常输出,e则是e的n次方格式 //参数3:小数点后多少位,参数4:bitSize为64 str5 = strconv.FormatFloat(float64(num4),'f',2,64) //参数1:直接传变量即可 str6 = strconv.FormatBool(bo1) fmt.Println(str4,str5,str6) //Itoa()函数挺好使的,直接把一个int转换成字符串,但是不支持int64,相当于num5如果不是int还需要转int var num5 int = 100 str7 = strconv.Itoa(num5) fmt.Println(str7) }
3. string类型转基本数据类型
func ParseBool(str string) (value bool, err error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
func ParseFloat(s string, bitSize int) (f float64, err error)
使用strconv.Parsexxxx()函数来做不同类型的转换。
下面为案例,充分说明如何将字符串回转基本类型:
package main
import (
"fmt"
"strconv"
)
func main() {
/*
可以看出来这里面几个函数都会返回两个值,一个是value,一个是error,我们
需要的只是value,对error并不关心,所以可以使用"_"来忽略这个error
例如:
b , _ = strconv.ParseBool(str)
func ParseBool(str string) (value bool, err error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
func ParseFloat(s string, bitSize int) (f float64, err error)
*/
//布尔值转换
var str string = "true"
var b bool
b , _ = strconv.ParseBool(str) //这个写法要注意,因为返回两个值
fmt.Println(b)
//int转换
var str1 string = "123456"
var num int64
num , _ = strconv.ParseInt(str1,10,64)
fmt.Printf("%T\n",num)
//float转换
var str2 string = "123.456"
var num1 float32
var num2 = float64(num1)
num2 , _ = strconv.ParseFloat(str2,64)
fmt.Println(num2)
}