Golang基本类型之间的相互转换

一、介绍

Golang和java/c不同,Go在不同类型的变量之间赋值时需要显示转换,也就是golang中数据类型不能自动转换

二、基本语法

表达式:T(v)
含义:将值v转换为类型T
T:数据类型,比如int32,int64,float32等
v:需要转换的变量
例如:

	var i int32 = 32
	var f float64 = float64(i)
	var u unit8 = unit8(i)

注意细节

  1. Go中,数据类型的转换可以从表示范围小到表示范围大的,也可以从表示范围大的到表示范围小的。
  2. 被转换的是变量的值,变量本身的数据类型并没有变化
  3. 在转换中表示范围大的转换为表示范围小的,比如int64转成int8,编译时不会报错,只是转换结果是按照溢出处理,和我们希望的结果不一样。
	var num1 int64 = 999999
	var num2 int8 = int8(num1)
	fmt.Println("num2=",num)

输出结果为:num2=63,显然不是我们想要的结果,按溢出处理。

判断下方案例是否能编译通过:
案例一:

	var n1 int32 = 32
	var n2 int64
	var n3 int8
	n2 = n1 + 20 //编译不通过,int32 ---> int64
	n3 = n1 + 20 //编译不通过,int32 ---> int8
	fmt.Println("n2=",n2,"n3=",n3)

正确代码如下:

	var n1 int32 = 32
	var n2 int64
	var n3 int8
	n2 = int64(n1) + 20
	n3 = int8(n1) + 20
	fmt.Println("n2=",n2,"n3=",n3)

输出结果为:n2= 52 n3= 52

案例二:

	var n4 int32 = 12
	var n5 int8
	//var n6 int8
	n5 = int8(n4) + 127 //编译通过,但是结果不是127+12,按溢出处理
	//n6 = int8(n4) + 128 //编译不通过
	fmt.Println("n5=",n5)

输出结果为:n5= -117

三、基本数据类型和string的转换

1. 基本类型转string类型

方式1:func Sprintf("%参数",表达式),参数需要和表达式的数据类型一致

	var n1 int = 999
	var n2 float64 = 56.420
	var b bool = false
	var c byte = 'f'
	var str string
	
	str = fmt.Sprintf("%d",n1)
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = fmt.Sprintf("%f",n2)
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = fmt.Sprintf("%t",b)
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = fmt.Sprintf("%c",c)
	fmt.Printf("str type is %T, str=%q\n",str,str)

运行结果为:

str type is string, str="999"
str type is string, str="56.420000"
str type is string, str="false"
str type is string, str="f"

方式二:使用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
func Itoa(i int) string

	var n3 int64 = 999
	var n4 float64 = 56.420
	var n5 uint = 888
	var b1 bool = false
	var str string
	var n6 int = 222
	
	str = strconv.FormatInt(n3,10) // 10表示十进制
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = strconv.FormatFloat(n4,'f',10,64) // 'f'表示按照-ddd.dddd格式输出,10表示小数位保留10位,64:表示这个小数是float64
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = strconv.FormatUint(uint64(n5),10) // 10表示十进制
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = strconv.FormatBool(b1)
	fmt.Printf("str type is %T, str=%q\n",str,str)
	
	str = strconv.Itoa(n6)
	fmt.Printf("str type is %T, str=%q\n",str,str)

输出结果为:

str type is string, str="999"
str type is string, str="56.4200000000"
str type is string, str="888"
str type is string, str="false"
str type is string, str="222"
2.string类型转基本数据类型

使用strconv里的函数:

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)
func Atoi(s string) (i int, err error)

	var str1 string = "false"
	b,_:= strconv.ParseBool(str1) // _表示忽略第二个返回值
	fmt.Printf("b type is %T, b=%v\n",b,b)
	
	var str2 string = "1234"
	num2,_:= strconv.ParseInt(str2,10,64) // 10表示10进制,64表示int64(无溢出赋值的整数类型)
	fmt.Printf("num2 type is %T, num2=%v\n",num2,num2)
	
	var str3 string = "4567"
	num3,_:= strconv.Atoi(str3)
	fmt.Printf("num3 type is %T, num3=%v\n",num3,num3)
	
	var str4 string = "8910"
	num4,_:= strconv.ParseUint(str4,10,64) // 10表示10进制,64表示int64(无溢出赋值的整数类型)
	fmt.Printf("num4 type is %T, num4=%v\n",num4,num4)
	
	var str5 string = "12.3645"
	num5,_:= strconv.ParseFloat(str5,10) // 10表示10进制
	fmt.Printf("num5 type is %T, num5=%v\n",num5,num5)

输出结果为:

b type is bool, b=false
num2 type is int64, num2=1234
num3 type is int, num3=4567
num4 type is uint64, num4=8910
num5 type is float64, num5=12.3645

注意事项

  1. 在将string转成基本数据类型的时候,要确保string类型能够转成成效的数据,否则都为基本类型的默认值。例如:我们可以将"5461",转成整数,但是不能把"hello"转成一个整数,如果这样做,golang直接将其变为0。其他类型也一样float3变为0,bool变为false。
posted @ 2021-05-04 15:26  若雨蚂蚱  阅读(1439)  评论(0编辑  收藏  举报