golang学习笔记——类型断言

类型断言

Go语言的类型断言类型转换在形式上仅相差一小点,之前我还一直以为是类型转换。没想到这是错误的。

在 Golang 中,类型转换和类型断言是两种不同的操作。类型转换是将不同类型的变量进行转换,需要开发人员进行显式的类型转换操作。类型断言是将接口类型转换为具体的类型,或者将具体类型转换为接口。类型断言的成功与失败取决于接口值的动态类型是否与尝试断言的类型相匹配。

Go 语言类型断言

GoLang中的 interface{}any 可以代表所有类型,包括基本类型string、int、int64,以及自定义的 struct 类型。

interface{} 好比 java 中的 Object,java 中的所有类都实现了Object。

下面这个函数接收一个 interface{} 的参数,就代表了它可以传递任何类型的变量。如果在代码中强转 astring,如以下的代码:

func funcName(a interface{
   }) string {
   
    return string(a)
}

此时编译器将会返回:

cannot convert a (type interface{}) to type string: need type assertion

编译器提示我们用类型断言(type assertion)约束变量。接下来介绍几种使用类型断言的方法。

直接断言使用

直接断言使用,返回对应类型的值

  • 如果断言成功,则 变量b == 变量a
  • 如果断言失败,则 panic

语法如下:

变量b :=变量a.(类型)

举例

如果 断言为 string,则输出正常name type = string, name = tom
如果断言为 非 string,则 panic

package main

import "fmt"
import "reflect"

func testTypeAssertion1() {
   

	var name any = "tom"

	nameType := reflect.TypeOf(name)

	fmt.Printf("name type = %v, name = %v\n", nameType, name.(string))

	fmt.Printf("name type = %v, name = %v\n", nameType, name.(int))
}

func main() {
   
	testTypeAssertion1()
}

输出

name type = string, name = tom
panic: interface conversion: interface {
   } is string, not int

第一个fmt正常输出,第二个fmt发生panic

断言判断并返回是否成功,可配合if

从一些业务角度来讲,如果断言不成功直接 panic,程序会终止,显然并不能满足一些业务的需求,比如记录错误日志,或走其他分支等等,所以 GoLang 也提供了另一个参数,返回断言是否成功

  • 如果断言成功,返回对应类型的值,即 变量b == 变量aoktrue
  • 如果断言失败,变量b为对应 断言类型默认值okfalse

语法如下:

变量b, ok = 变量a.(类型)

举例

func testTypeAssertion2() {
      
    var name any = "tom"    
    nameStringData, ok1 := name.(string)
    fmt.Printf("name type = %v, name = %v, assert success ? %v, ok type = %T\n", reflect.TypeOf(nameStringData), nameStringData, ok1, ok1)
        
    nameIntData, ok2 := name.(int)
    fmt.Printf("name type = %v, name = %v, assert success ? %v, ok type = %T\n", reflect.TypeOf(nameIntData), nameIntData, ok2, ok2)
}

输出结果,不出意外,没有 panic,可以看出,第二个参数 ok 返回了断言是否成功, bool类型

name type = string, name = tom, assert success ? true, ok type = bool
name type = int, name = 0, assert success ? false, ok type = bool

也可以看出转 int 未成功后的 nameIntDataint 类型,默认值是 0

断言成功或失败,结合 if 执行不同的操作


if ok1 {
   
    name = "Mike"
    fmt.Printf("ok1 true, change name to %v\n", name)
} else {
   
    name = "mike"
    fmt.Printf("ok1 false, change name to %v\n", name)
}


if ok2 {
   
    name = "sara"
    fmt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值