Golang类型断言

126 阅读2分钟

先体验一下简单的类型断言

由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言。

思考

任何类型都可以赋值给空接口,空接口怎么赋值给具体类型呢?

代码

package main

import (
	"fmt"
)

func main() {
	// 类型断言 float32 - interface{}
	var m float32
        // 定义空接口
	var x interface{}
	x = m
	fmt.Printf("x 类型: %T, 值: %v \n", x, x)
	// x 类型: float32, 值: 0
	n := x.(float32)
	fmt.Printf("n 类型: %T, 值: %v \n", n, n)
	// n 类型: float32, 值: 0

	// 带检测的类型断言
	n2, ok := x.(float32)
	if ok {
		fmt.Println("convert success")
		fmt.Printf("n2 类型: %T, 值: %v \n", n2, n2)
	} else {
		fmt.Println("convert error")
	}
	// panic: interface conversion: interface {} is float32, not float64

	/* if n2, ok := x.(float64); ok {
	} */

	fmt.Println("panic 之后还会执行吗")
}

类型断言最佳实践

说明

循环判断传入参数的类型

代码

// 编写函数,判断参数是什么类型
package main

import (
	"fmt"
)

// 定义 Student 类型
type Student struct{}

// 可以接收多个不同类型的参数
func JudgeType(items ...interface{}) {
	for i, v := range items {
		i = i + 1
		// 类型断言
		switch v.(type) {
		case bool:
			fmt.Printf("第%v个参数是 bool 类型,值:%v \n", i, v)
		case float32:
			fmt.Printf("第%v个参数是 float32 类型,值:%v \n", i, v)
		case float64:
			fmt.Printf("第%v个参数是 float64 类型,值:%v \n", i, v)
		case int, int16, int32, int64:
			fmt.Printf("第%v个参数是 整数 类型,值:%v \n", i, v)
		case string:
			fmt.Printf("第%v个参数是 string 类型,值:%v \n", i, v)
		case Student:
			fmt.Printf("第%v个参数是 Student 类型,值:%v \n", i, v)
		case *Student:
			fmt.Printf("第%v个参数是 *Student 类型,值:%v \n", i, v)
		default:
			fmt.Printf("第%v个参数类型不确定,值:%v \n", i, v)
		}
	}
}

func main() {
	var n1 float32 = 1.1
	var n2 float64 = 2.1
	var name string = "tom"
	address := "北京"
	n3 := 64
	stu1 := Student{}
	stu2 := &Student{}
	var a interface{}
	var b *interface{}
	JudgeType(n1, n2, name, address, n3, stu1, stu2, a, b)

	fmt.Printf("a 类型: %T, 值: %v \n", a, a) // a 类型: <nil>, 值: <nil>
	fmt.Printf("b 类型: %T, 值: %v \n", b, b) // b 类型: *interface {}, 值: <nil>
}

上面代码输出结果

1个参数是 float32 类型,值:1.12个参数是 float64 类型,值:2.13个参数是 string 类型,值:tom   
第4个参数是 string 类型,值:北京  
第5个参数是 整数 类型,值:646个参数是 Student 类型,值:{}   
第7个参数是 *Student 类型,值:&{} 
第8个参数类型不确定,值:<nil>     
第9个参数类型不确定,值:<nil>
a 类型: <nil>, 值: <nil>
b 类型: *interface {}, 值: <nil>

🎈🎈🎈

🎉 喜欢的小伙伴可以点赞收藏关注

✨ 欢迎大家转发评论交流, 蟹蟹😊

👉 gitHub代码