教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 【Golang小知识】空接口(interface {})类型判断

【Golang小知识】空接口(interface {})类型判断

发布时间:2023-01-20   编辑:jiaochengji.com
教程集为您提供【Golang小知识】空接口(interface {})类型判断等资源,欢迎您收藏本站,我们将为您提供最新的【Golang小知识】空接口(interface {})类型判断资源

空接口可以存储任意类型的数据,当需要判断到底是何种类型时,可以使用以下方法。

1 直接断言

比如我们收到一个类型为interface{}的变量unknown,可以通过如下代码直接断言是否为string类型:

val, ok := unknow.(string)

如果返回ok为true,则变量unknown为string类型,同时返回一个val存储string类型的值。
如果我们确定unknown为string类型,也可以不返回ok变量,直接强转获取其值:

val := unknow.(string)

但是使用这种方法有一定的风险,如果不是string类型,会发生panic:

panic: interface conversion: interface {} is int, not string

2 反射

反射位于relfect包,获取类型使用reflect.TypeOf,获取值使用reflect.ValueOf,具体使用方法:

retType = reflect.TypeOf(unknow)
val = reflect.ValueOf(unknow)

3 type关键字判断

该方法必须适用于switch case中,通过不同的case来进行不同的处理。

switch unknow.(type){
    case string:
        //string类型
    case int:
        //int类型
}

举例说明

该例子分别用了上述列举的各种方法来对一个字符串进行类型判断及取值。

package main

import (
    "fmt"
    "reflect"
)

func main(){
    var str interface{} = "abc"

    retType,val := interfaceAssert1(str)
    fmt.Printf("type:%v, value:%v\n", retType, val)

    retType2,val2 := interfaceAssert2(str)
    fmt.Printf("type:%v, value:%v\n", retType2, val2)

    retType3 := interfaceAssert3(str)
    fmt.Printf("type:%v\n", retType3)

}

//直接断言
func interfaceAssert1(unknow interface{})(retType string, val interface{}){
    val, ok := unknow.(string)

    if ok{
        return "string", val
    }else{
        return "not string", nil
    }

}

//反射
func interfaceAssert2(unknow interface{})(retType reflect.Type, val reflect.Value){
    retType = reflect.TypeOf(unknow)
    val = reflect.ValueOf(unknow)
    return retType,val
}

//type关键字
func interfaceAssert3(unknow interface{})(retType string){
    switch unknow.(type){
    case string:
        return "string"
    case int:
        return "int"
    default:
        return "other type"
    }
}
到此这篇关于“【Golang小知识】空接口(interface {})类型判断”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
2020-10-18Go语言接口
一看就懂系列之Golang的接口
【Golang】go语言面向接口
Golang interface 接口要点梳理
golang 初始化并赋值_Golang | 既是接口又是类型,interface是什么神仙用法?
Go语言基础之接口(面向对象编程下)
真的理解go interface了吗?
Go接口之nil != nil
Go语言的空接口,接口类型断言
go interface类型转换_Golang系列5 | Interface接口&map类型

[关闭]
~ ~