Golang之路---03 面向对象——类型断言

这篇具有很好参考价值的文章主要介绍了Golang之路---03 面向对象——类型断言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

类型断言

作用

  1. 检查 i 是否为 nil
  2. 检查 i 存储的值是否为某个类型

使用方式

第一种:
t := i.(T)

这个表达式可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回值给 t,如果断言失败,就会触发 panic。(即nil或者接口对象类型不为T时均会触发panic)
eg;

func main() {
    var i interface{} = 10
    t1 := i.(int)
    fmt.Println(t1)

    fmt.Println("=====分隔线=====")

    t2 := i.(string)
    fmt.Println(t2)
}

Golang之路---03 面向对象——类型断言,Golang,golang,开发语言,后端
可以发现在执行第二次断言的时候失败了,并且触发了 panic。

第二种

t, ok:= i.(T)
  和上面一样,这个表达式也是可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回其值给 t,并且此时 ok 的值 为 true,表示断言成功。
  如果接口值的类型,并不是我们所断言的 T,就会断言失败,但和第一种表达式不同的事,这个不会触发 panic,而是将 ok 的值设为 false ,表示断言失败,此时t 为 T 的零值。
eg:

func main() {
	var i interface{} = 10
    t1, ok := i.(int)
    fmt.Printf("%d-%t\n", t1, ok)

    fmt.Println("=====分隔线1=====")

    t2, ok := i.(string)
    fmt.Printf("%s-%t\n", t2, ok)

    fmt.Println("=====分隔线2=====")

    var k interface{} // nil
    t3, ok := k.(interface{})
    fmt.Println(t3, "-", ok)

    fmt.Println("=====分隔线3=====")
    k = 10
    t4, ok := k.(interface{})
    fmt.Printf("%d-%t\n", t4, ok)

    t5, ok := k.(int)
    fmt.Printf("%d-%t\n", t5, ok)
}

Golang之路---03 面向对象——类型断言,Golang,golang,开发语言,后端

类型断言(Type Switch)

如果需要区分多种类型,可以使用 type switch 断言,这个将会比一个一个进行类型断言更简单、直接、高效。


func findType(i interface{}) {
    switch x := i.(type) {
    case int:
        fmt.Println(x, "is int")
    case string:
        fmt.Println(x, "is string")
    case nil:
        fmt.Println(x, "is nil")
    default:
        fmt.Println(x, "not type matched")
    }
}
func main() {
    findType(10)      // int
    findType("hello") // string

    var k interface{} // nil
    findType(k)

    findType(10.23) //float64
}

Golang之路---03 面向对象——类型断言,Golang,golang,开发语言,后端
注:

  1. 类型断言,仅能对静态类型为空接口(interface{})的对象进行断言,否则会抛出错误。

  2. 类型断言完成后,实际上会返回静态类型为你断言的类型的对象,而要清楚原来的静态类型为空接口类型(interface{}),这是 Goang的隐式转换。文章来源地址https://www.toymoban.com/news/detail-623713.html

到了这里,关于Golang之路---03 面向对象——类型断言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开启golang学习之路

    Go 编程语言是一个开源项目,旨在提高程序员的工作效率。 Go 富有表现力、简洁、干净且高效。它的并发机制使编写能够充分利用多核和联网机器的程序变得容易,而其新颖的类型系统可以实现灵活和模块化的程序构建。 Go 可以快速编译为机器代码,同时还具有垃圾收集的

    2024年01月25日
    浏览(32)
  • Golang之路---02 基础语法——字典

    字典(Map 类型),是由若干个 key:value 这样的键值对映射组合在一起的数据结构。 key 不能是切片,不能是字典,不能是函数。 字典初始化 方式:map[KEY_TYPE]VALUE_TYPE 字典的相关操作 嵌套字典 判断key是否存在 当key不存在,会返回value-type的零值 ,所以你不能通过返回的结果是

    2024年02月15日
    浏览(45)
  • Golang之路---04 并发编程——WaitGroup

    为了保证 main goroutine 在所有的 goroutine 都执行完毕后再退出,前面使用了 time.Sleep 这种简单的方式。 由于写的 demo 都是比较简单的, sleep 个 1 秒,我们主观上认为是够用的。 但在实际开发中,开发人员是无法预知,所有的 goroutine 需要多长的时间才能执行完毕,sleep 多了,

    2024年02月14日
    浏览(24)
  • 【Golang 接口自动化03】 解析接口返回XML

    目录 解析接口返回数据 定义结构体 解析函数: 测试 优化 资料获取方法 上一篇我们学习了怎么发送各种数据类型的http请求,这一篇我们来介绍怎么来解析接口返回的XML的数据。 定义结构体 假设我们现在有一个接口返回的数据 resp 如下: 要解析这个数据,首先我们要定义

    2024年02月14日
    浏览(33)
  • Golang之路---02 基础语法——常量 (包括特殊常量iota)

    常量 iota iota是Golang语言的常量计数器,只能在常量表达式中使用 iota在const出现时将被重置为0,const中每新增一行常量声明将使iota计数一次 输出结果: 注: iota是const语句块中的行索引,而不是变量索引,其计数只与const语句块中的行数相关

    2024年02月15日
    浏览(29)
  • 面向对象 学习黑马视频(03)

    构造函数 析构函数(1) 构造函数 析构函数(2) 包含:构造函数顺序和析构函数顺序 成员变量 成员函数 C++对象模型 this指针 空指针访问成员函数 const 修饰成员函数 ;常对象 友元,让其他类可以访问本类中的私有变量 (1)全局函数做友元 (2)友元类 (3)成员函数 友元

    2024年02月10日
    浏览(27)
  • Golang自定义类型与类型别名

    type myInt int32 与 type myInt = int32 ,概念并不相同 自定义类型: type myInt int32 通过这种方式定义的类型是一个 全新的类型 ,这个新类型与 int32 有相同的底层结构,但是却与 int32 类型不兼容。 尽管 myInt 的底层类型是 int32 ,但它们在类型系统中是不同的。 类型别名: type myInt

    2024年02月13日
    浏览(32)
  • Python学习之路-初识面向对象

    面向对象编程(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的编程典范,同时也是一种程序开发的抽象方针。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。

    2024年01月21日
    浏览(43)
  • Java面向对象03——三大特性之继承

    继承就是 Java 允许我们用 extends ,让一个类与另一个类建立起一种父子关系; 被继承的类称为父类(基类、超类),继承父类的类都称为子类(派生类), 当子类继承父类后,就可以直接使用父类公共的属性和方法了 当子类继承父类后,就可以直接使用父类公共的属

    2024年04月27日
    浏览(32)
  • 【golang】每日chatGPT:golang中实现ENUM枚举类型 | go enum

    在golang极简的哲学思想中,没有内置枚举类型 这里我们通过map+iota去实现一个枚举类型 枚举值如下: key value 1 发电类 2 储能类 13 负荷类 打印如下: 发电类 储能类 负荷类 ========= 储能类

    2024年02月15日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包