1、高精度向低精度类型转换数值可能会有损失
package main
func main() {
var i64 int64 = 9999999999
var i32 int32 = int32(i64)
println(i32) //打印1410065407
var f32 float32 = 2.2
i32 = int32(f32)
println(i32) //打印2
var b bool = false
var i int = 1
b = bool(i) //失败
println(b)
}
2、数值计算时数据类型需要一致
package main
func main() {
var i8 int8 = 10
var i16 int16 = 10
var i32 int32 = 0
i32 = int32(int16(i8) + i16)
println(i32)
}
3、字节切片转化为字符串 uint8 string 互转
package main
import (
"fmt"
"reflect"
)
func main() {
s := "中国aoe"
fmt.Printf("TYPE is %T,value is %+v\n", []byte(s), []byte(s))
fmt.Printf("TYPE is %T,value is %+v\n", []rune(s), []rune(s))
a := []uint8{228, 184, 173, 229, 155, 189, 97, 111, 101}
println(string(a))
a2 := []rune{20013, 22269, 97, 111, 101}
println(string(a2))
}
1、特殊的数据类型 interface{} 不能使用 T(表达式)的方式转换
package main
func main() {
// 定义interface{}类型数据
var i interface{} = 10
println(i) // 打印(0x91e100,0x93c548)
println(int(i)) // 报错
}
2、在go中 interface{} 可以是任何数据类型, interface{} 类型转换时需要使用golang类型推断表达式
package main
func main() {
// 定义interface{}类型数据
var i interface{} = 10
// 推断i的类型是否时为int,
// 是ok值为true,不是值为false
// ok为true时,n为i的int类型值
if n, ok := i.(int); ok {
println(10 + n)// 打印20
}
}
3、当 interface{} 可能是多种不确定的类型时,可以使用switch推断匹配不同类型
package main
func main() {
var i interface{} = 10
switch v := i.(type) {
case int:
println("int", v)
case int32:
println("int32", v)
case string:
println("stirng", v)
default:
println("未知类型")
}
}
4、我们可以通过反射的方式获取到数据的类型
package main
import "reflect"
func main() {
var i interface{} = []string{"tom"}
t := reflect.TypeOf(i)
println(t.Name(), t.Kind(), t.Kind().String(), t.Elem().Name())
v := reflect.ValueOf(i)
println(v.Kind(), v.Kind().String(), v.String())
}