Go语言-类型断言

类型断言基本介绍

类型断言(Type Assertion) 是一种用来检查接口变量具体类型的方法。

从接口值中提取出底层的具体类型值,或者验证接口值是否持有特定的具体类型。

类型断言基本语法

value, ok := interfaceValue.(TargetType)
  • interfaceValue:表示要进行类型断言的接口值。
  • TargetType:希望断言的目标类型。
  • 如果断言成功,value 将包含转换后的值,ok 为 true
  • 如果断言失败,value 的值是该类型的零值,ok 为 false

类型断言示例

package main

import "fmt"

func main() {
	var i interface{} = "hello"

	// 简单类型断言
	s := i.(string)
	fmt.Println(s) // 输出: hello

	// 安全类型断言
	value, ok := i.(string)
	if ok {
		fmt.Println(value) // 输出: hello
	} else {
		fmt.Println("类型断言失败")
	}

	// 错误的类型断言会引发 panic
	// f := i.(float64)  // 这里会导致运行时错误
}

类型断言可以有一个接收参数也可以有两个,具体看上述例子。

类型断言返回的值是转换回来的类型,上述例子中就是string类型。

简单类型断言转换失败报错panic。

类型断言使用场景

1. 场景需求:若干个自定义类型实现了一个接口。这写自定义类型可以在一个函数中统一操作,现在要求,如果是自定义类型A,添加一些额外操作...

该场景使用类型断言解决,结合if语句判断就可以。

func Working(i Interface{}){ //接收某个接口类型参数
    value, ok := i.(struct_type) //断言成功的话,value已经是struct_type类型了
	if ok {
		操作体
	} 
    ......
}

2. 场景需求:判断传入的实参到底是什么类型,不同的类型进行不同的操作。

package main

import (
	"fmt"
)

// TypeJudge 接收任意数量和类型的参数,并尝试判断它们的具体类型
func TypeJudge(items ...interface{}) {
	for i, item := range items {
		switch v := item.(type) {  //简单类型断言
		case int, int64:
			fmt.Printf("第 %d 个参数是 int 类型,值为: %d\n", i+1, v)
		case string:
			fmt.Printf("第 %d 个参数是 string 类型,值为: %s\n", i+1, v)
		case float64:
			fmt.Printf("第 %d 个参数是 float64 类型,值为: %f\n", i+1, v)
		default:
			fmt.Printf("第 %d 个参数是 unknown 类型,值为: %v\n", i+1, v)
		}
	}
}

func main() {
	TypeJudge(10, "hello", 3.14, true)
}

在这里复习一个知识点,可变参数

func TypeJudge(k int, i ...float64)

这是一个函数,它有两个参数:
k int:一个普通的整型参数。
i ...float64:一个可变参数(variadic parameter),表示可以传入 0 个或多个 float64 类型的值。
i 的类型是一个 float64 的切片。
方式1:
TypeJudge(10, 1.1, 2.2, 3.3)
方式2:直接传一个切片类型
values := []float64{1.1, 2.2, 3.3}
TypeJudge(10, values...)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值