基本数据类型的相互转换
Go在不同类型的变量之间赋值时需要显示转换,不能自动转换
// 基本语法// 表达式 T(v) 将值v转换成类型T// T就是数据类型: int32, int64, float32...// v就是需要转换的变量// 不考虑溢出的情况下,类型转换不会改变数值大小var i int8 = 100var n int32 = int32(i)fmt.Println(i, n) // 100 100// 不支持隐式转换, 代码检查不通过,编译不能通过var n1 int32 = 30var n2 int16var n3 int64// cannot use n1 + 2 (value of type int32) as int16 value in assignmentn2 = n1 + 2 // n1为int32, n1 + 2得到的还是int32类型, 而n2是int16类型n3 = n1 + 2 // 同上fmt.Println(n1, n2, n3) // cannot use n1 + 2 (type int32) as type int16 in assignment// 修改如下:// 显示转换n2 = int16(n1) + 2 // n1为int32, n2为int16, 所以先把加数n1转换成int16, 再做加法n3 = int64(n1) + 2 // 同上fmt.Println(n1, n2, n3) // 30 32 32// 溢出测试var n1 int32 = 12var n2 int8var n3 int8n2 = int8(n1) + 127n3 = int8(n1) + 128 // 128代码检查报错, constant 128 overflows int8fmt.Println(n1, n2, n3)// 修改如下// 这时候语言检查是没有问题的// 计算结果超出类型范围,溢出处理n2 = int8(n1) + 127n3 = int8(n1) + 120fmt.Println(n1, n2, n3)// 输出 12 -117 -124

小知识
package main// import "unsafe"// import "fmt"import (_ "fmt" // 如果引入一个包没有使用,但是又不想删除,可以再前面加一个 _ 表示忽略_ "unsafe")func main() {}
基本数据类型和string的转换
// 方法一:fmt.Sprintf("%参数", 表达式)func main() {var n int = 10var n1 float64 = 12.56var b bool = falsevar myChar byte = 'h'var str stringstr = fmt.Sprintf("%d", n)fmt.Printf("%T %v\n", str, str) // string 10str = fmt.Sprintf("%f", n1)fmt.Printf("%T %v\n", str, str) // string 12.560000str = fmt.Sprintf("%t", b)fmt.Printf("%T %q\n", str, str) // string "false"str = fmt.Sprintf("%q", myChar)fmt.Printf("%T %q\n", str, str) // string "'h'"}// 方法二:// 使用 strconv 包的函数func FormatBool(b bool) stringfunc FormatInt(i int64, base int) stringfunc FormatUint(i uint64, base int) stringfunc FormatFloat(f float64, fmt byte, prec, bitSize int) stringfunc Itoa(i int) string// strconv 包函数转换var num3 int = 99var num4 float64 = 23.456var b2 bool = truevar num5 int = 4567str = strconv.FormatInt(int64(num3), 10)fmt.Printf("%T %q\n", str, str) // string "99"str = strconv.FormatFloat(float64(num4), 'f', 10, 64)// 4个参数描述: f, fmt(表示格式), prec(控制精度), bitSize(表示f的来源类型(32:float32、64:float64))fmt.Printf("%T %q\n", str, str) // string "23.4560000000"str = strconv.FormatBool(b)fmt.Printf("%T %q\n", str, str) // string "true"str = strconv.Itoa(num5)fmt.Printf("%T %q\n", str, str) // string "4567"
string和基本数据类型转换
注意事项:
转成基本数据类型的时候,确保string类型能够转成有效的数据,比如把”123”转成整数123,
不能把别的字符串,类似”hello”,转成整数,Golang直接将其转成默认零值0
// 使用 strconv 包的函数func ParseBool(str string) (value bool, err error)// 以下三个返回值是64为,必须用64位的类型去接收,如果需要32位,则手动转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)// func strconv.ParseBool(str string) (bool, error)// 1、返回两个值,一个是转换的bool值,一个是error// 2、我们只需要拿到第一个返回值, 第二个忽略b, _ = strconv.ParseBool(str)fmt.Printf("%T %v\n", b, b) // bool truevar str2 string = "123"var n int64var n2 intn, _ = strconv.ParseInt(str2, 10, 64)n2 = int(n) // int64转成intfmt.Printf("%T %v\n", n, n) // int64 123fmt.Printf("%T %v\n", n2, n2) // int 123var str3 string = "123.456"var f1 float64f1, _ = strconv.ParseFloat(str3, 64)fmt.Printf("%T %v\n", f1, f1) // float64 123.456// 注意, 默认零值var str4 string = "hello"var f2 float64var b2 bool = true // 不管原来是什么值,如果没有转成功,就会置为falsef2, _ = strconv.ParseFloat(str4, 64)fmt.Printf("%T %v\n", f2, f2)b2, _ = strconv.ParseBool(str4) // float64 0fmt.Printf("%T %v\n", b2, b2) // bool false
