数据类型转化
2022-02-04 大约 4 分钟
go在不同类型的变量之间赋值时需要显示转化,并且只有显示转化(强制转化)
语法:
表达式T(v)将值v转化为类型T
T:就是数据类型
v:就是需要转化的变量
1
2
3
2
3
# 整型之间的转化
package main
import "fmt"
func main() {
var num int = 100
// 不能使用自动转化
//var num2 float32 = num
//fmt.Println(num2) // cannot use num (type int) as type float32 in assignment
// 将int强制转化为float32
var num2 float32 = float32(num)
fmt.Println(num2) // 100
// 将 float64 转化为int8时,编译器并不会报错,但是会数据溢出
var num3 float64 = 888888
var num4 int8 = int8(num3)
fmt.Println(num4) // 56
// 将int32强制转化为int64
var num5 int32 = 12
// 下面这种会出错,因为 num5 + 20的结果是int32,和int64类型不一致
//var num6 int64 = num5 + 20
var num6 int64 = int64(num5) + 20
fmt.Println(num6) // 32
// 将int64强制转化为int8
var num7 int64 = 120
// 正常输出:可能会溢出,因为相加后的结果可能超过127
var num8 int8 = int8(num7) + 127
// 报错:因为int8的取值范围是-128~127,而128已经超过最大值127
//var num9 int8 = int8(num7) + 128
fmt.Println(num8) // -9
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 基本数据类型转字符串
在程序开发中,我们经常需要将基本数据类型转成string类型。或者将string类型转成基本数据类型。
语法:
方式一
func Sprintf(format string, a ...interface{}) string
1Sprintf根据format参数生成格式化的字符串并返回该字符串。
fmt.Sprintf("%参数", 表达式)
1方式二
使用strconv包含的函数
1
# 方式一
package main
import "fmt"
func main() {
var n1 int = 19
var s1 string = fmt.Sprintf("%d", n1)
fmt.Printf("s1对应的类型是:%T; s1 = %q\n", s1, s1)
var n2 float32 = 4.79
var s2 string = fmt.Sprintf("%f", n2)
fmt.Printf("s2对应的类型是:%T; s2 = %q\n", s2, s2)
var n3 bool = false
var s3 string = fmt.Sprintf("%t", n3)
fmt.Printf("s3对应的类型是:%T; s3 = %q\n", s3, s3)
var n4 byte = 'a'
var s4 string = fmt.Sprintf("%c", n4)
fmt.Printf("s4对应的类型是:%T; s4 = %q\n", s4, s4)
}
// 打印结果如下
// s1对应的类型是:string; s1 = "19"
// s2对应的类型是:string; s2 = "4.790000"
// s3对应的类型是:string; s3 = "false"
// s4对应的类型是:string; s4 = "a"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 方式二
package main
import (
"fmt"
"strconv"
)
func main() {
var n1 int = 19
var s1 string = strconv.FormatInt(int64(n1), 10)
fmt.Printf("s1对应的类型是:%T; s1 = %q\n", s1, s1)
var n2 float32 = 4.29
// 第二个参数:‘f’(-ddd.dddd) 第三个参数:9 保留小数点后面9位
var s2 string = strconv.FormatFloat(float64(n2), 'f', 9, 64)
fmt.Printf("s2对应的类型是:%T; s2 = %q\n", s2, s2)
var n3 bool = false
var s3 string = strconv.FormatBool(n3)
fmt.Printf("s3对应的类型是:%T; s3 = %q\n", s3, s3)
}
// 打印结果如下:
// s1对应的类型是:string; s1 = "19"
// s2对应的类型是:string; s2 = "4.289999962"
// s3对应的类型是:string; s3 = "false"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 字符串转为基本数据类型
使用strconv包的函数
package main
import (
"fmt"
"strconv"
)
func main() {
// string -> bool
var s1 string = "true"
var b bool
// ParseBool这个函数的返回值有两个:(value bool, err error)
// value 就是我们得到的布尔类型的数据,err表示出现的错误
// 我们只关注得到的布尔类型的数据,err 可以用 _ 直接忽略
b, _ = strconv.ParseBool(s1)
fmt.Printf("b对应的类型是:%T; b = %v\n", b, b)
// string -> int64
var s2 string = "19"
var num1 int64
num1, _ = strconv.ParseInt(s2, 10, 64)
fmt.Printf("num1对应的类型是:%T; num1 = %v\n", num1, num1)
// string -> float32/float64
var s3 string = "3.14"
var f1 float64
f1, _ = strconv.ParseFloat(s3, 64)
fmt.Printf("f1对应的类型是:%T; f1 = %v\n", f1, f1)
}
// 打印结果如下:
// b对应的类型是:bool; b = true
// num1对应的类型是:int64; num1 = 19
// f1对应的类型是:float64; f1 = 3.14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 注意:
string向基本数据类型转化的时候,一定到确保string类型能够转成有效的数据类型,否则最后得到的结果就是按照对应类型的默认值输出
func main() {
var s4 string = "golang"
var b1 bool
b1, _ = strconv.ParseBool(s4)
fmt.Printf("b1对应的类型是:%T; b1 = %v\n", b1, b1)
var s5 string = "golang"
var num2 int64
num2, _ = strconv.ParseInt(s5, 10, 64)
fmt.Printf("num2对应的类型是:%T; num2 = %v\n", num2, num2)
}
// 打印结果如下:
// b1对应的类型是:bool; b1 = false
// num2对应的类型是:int64; num2 = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15