数据类型转换:
- 类型转换是将一种数据类型的变量转为另一种类型的变量
- Go强制要求使用显式类型转换。所以语法更能确定语句及表达式的明确含义
- 转换的时候如果大的转给小的,会有精度损失(数据溢出)比如int64转int8
转换格式:
// 将v转成T类型,但是v本身的数据类型并不会改变,只是把v变量的值类型转成T表达式 T(v)
演示:
func main() {var a int32 = 1999999 // 小转大一样要显示转换var b float64 = float64(a) // a转b a本身数据类型并不会改变,只是把a的值(1999999)转成了float64var c int8 = int8(a) // 大转小不会报错,但是数据溢出会丢失数据fmt.Println(c)fmt.Printf("a的数据类型是:%T\n b的数据类型是:%T\n c的数据类型是:%T\n", a, b, c)
}
输出:
127
a的数据类型是:int32
b的数据类型是:float64
c的数据类型是:int8
转换必须确保类型一致,不能将非bool类型结果当做true/false使用
func main() {x := 100var b bool = x // 错误:无法将 'x' (类型 int) 用作类型 boolif x { // 非布尔值 'x' (类型 int) 用作条件}
}
基本类型转string:
Sprintf():格式化为字符串
Sprintf和printf的区别:printf是将一个格式化的字符串打印到控制台,Sprintf是转换为字符串
参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。
格式:
接收变量 = fmt.Sprintf(%格式符,参数列表)
演示:
func main() {var (num1 int = 9num2 float64 = 9.99b bool = falsec byte = 'a'str string)str = fmt.Sprintf("%d", num1)fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)str = fmt.Sprintf("%f", num2)fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)str = fmt.Sprintf("%t", b)fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)str = fmt.Sprintf("%c", c)fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)
}
输出:
str的类型: string 值:9
str的类型: string 值:9.990000
str的类型: string 值:false
str的类型: string 值:a
strconv.Format方式:
strconv.Itoa 可以将数字转换成字符串类型的数字
func main() {var (num int = 24num2 float64 = 1.111str string)// FormatInt参数1:要转的变量 参数2:进制str = strconv.FormatInt(int64(num), 10)fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)// strconv.FormatInt也可以用来转换进制,比如将10进制转换为2进制,其它进制,换掉后面的数字就可以了str = strconv.FormatInt(123, 2)fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)// 'f':格式 10:保留10位 64:float64str = strconv.FormatFloat(num2, 'f', 10, 64)fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)str = strconv.FormatBool(false)fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)str = strconv.Itoa(num) fmt.Printf("str的类型: %T\t 值:%v\n ", str, str)
}
输出:
str的类型: string 值:24
str的类型: string 值:1111011
str的类型: string 值:1.1110000000
str的类型: string 值:false
str的类型: string 值:24
Append:
把整数等转换为字符串后,添加到现有的字节数组中。
演示:
func main() {// 整数转字符串,添加到字节数组中bytes := make([]byte, 0, 1024)bytes = strconv.AppendBool(bytes, true)// 第二个参数是要追加的数,指定10进制的方式追加bytes = strconv.AppendInt(bytes, 123456, 10)bytes = strconv.AppendQuote(bytes, "追加了吗")fmt.Println("bytes:", string(bytes)) //字节转字符
}
string转基本类型:
- 在将string类型转换成基本数据类型时,要确保string类型能够转成有有效的数据
- 例:可以把"123"转成int类型,但是不可以将"aaa"转成int类型,编译器不会报错,go会把它变成默认值0,因为
go会判断这个值能不能转成有效的数据,如果不可以会按照该数据的数据类型的默认值赋值。
strconv方式:
func main() {var (str string = "123"i int64 // 这里只能用int64f float64b bool)// str:字符串 base:进制 bitSize:数据类型i, _ = strconv.ParseInt(str, 10, 64)fmt.Printf("i的类型: %T\t 值:%v\n ", i, i)f, _ = strconv.ParseFloat(str, 64)fmt.Printf("f的类型: %T\t 值:%v\n ", f, f)b, _ = strconv.ParseBool(str)fmt.Printf("b的类型: %T\t 值:%v\n ", b, b)s, _ := strconv.Atoi("str")fmt.Printf("s的类型: %T\t 值:%v\n ", s, s)
}
输出:
i的类型: int64 值:123
f的类型: float64 值:123
b的类型: bool 值:false
s的类型: int 值:0
字符串转字节切片
func main() {// 字符串转切片var b = []byte("itzhuzhu")fmt.Printf("b=%v\n", b)// 切片转字符串var str = string([]byte{97, 98, 99})fmt.Printf("str=%v\n", str)
}
输出:
b=[105 116 122 104 117 122 104 117]
str=abc