golang学习之golang数据类型(下)go数据类型转换

文章目录

  • 一、一般格式 T(表达式)
  • 二、interface{}数据类型的转换

一、一般格式 T(表达式)

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))
}

二、interface{}数据类型的转换

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())
}

你可能感兴趣的:(golang,学习,开发语言)