基本数据类型的相互转换
Go在不同类型的变量之间赋值时需要显示转换,不能自动转换
// 基本语法
// 表达式 T(v) 将值v转换成类型T
// T就是数据类型: int32, int64, float32...
// v就是需要转换的变量
// 不考虑溢出的情况下,类型转换不会改变数值大小
var i int8 = 100
var n int32 = int32(i)
fmt.Println(i, n) // 100 100
// 不支持隐式转换, 代码检查不通过,编译不能通过
var n1 int32 = 30
var n2 int16
var n3 int64
// cannot use n1 + 2 (value of type int32) as int16 value in assignment
n2 = 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 = 12
var n2 int8
var n3 int8
n2 = int8(n1) + 127
n3 = int8(n1) + 128 // 128代码检查报错, constant 128 overflows int8
fmt.Println(n1, n2, n3)
// 修改如下
// 这时候语言检查是没有问题的
// 计算结果超出类型范围,溢出处理
n2 = int8(n1) + 127
n3 = int8(n1) + 120
fmt.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 = 10
var n1 float64 = 12.56
var b bool = false
var myChar byte = 'h'
var str string
str = fmt.Sprintf("%d", n)
fmt.Printf("%T %v\n", str, str) // string 10
str = fmt.Sprintf("%f", n1)
fmt.Printf("%T %v\n", str, str) // string 12.560000
str = 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) 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
// strconv 包函数转换
var num3 int = 99
var num4 float64 = 23.456
var b2 bool = true
var num5 int = 4567
str = 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 true
var str2 string = "123"
var n int64
var n2 int
n, _ = strconv.ParseInt(str2, 10, 64)
n2 = int(n) // int64转成int
fmt.Printf("%T %v\n", n, n) // int64 123
fmt.Printf("%T %v\n", n2, n2) // int 123
var str3 string = "123.456"
var f1 float64
f1, _ = strconv.ParseFloat(str3, 64)
fmt.Printf("%T %v\n", f1, f1) // float64 123.456
// 注意, 默认零值
var str4 string = "hello"
var f2 float64
var b2 bool = true // 不管原来是什么值,如果没有转成功,就会置为false
f2, _ = strconv.ParseFloat(str4, 64)
fmt.Printf("%T %v\n", f2, f2)
b2, _ = strconv.ParseBool(str4) // float64 0
fmt.Printf("%T %v\n", b2, b2) // bool false