兄弟连Go语言培训之面向对象5:接口的类型断言

XDLGo · 2018-09-18 13:54:08 · 820 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-09-18 13:54:08 的主题,其中的信息可能已经有所发展或是发生改变。

  Go的目标是希望提升现有编程语言对程序库等依赖性(dependency)的管理,这些软件元素会被应用程序反复调用。由于存在并行编程模式,因此这一语言也被设计用来解决多处理器的任务。   很多人喜欢Go语言Google也对Go寄予厚望。其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决面向对象程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助程序设计师处理琐碎但重要的内存管理问题。Go的速度也非常快,几乎和C或C++程序一样快,且能够快速制作程序。   兄弟连教育区块链学院是由兄弟连教育携手微软区块链领域全球最具价值专家尹成及其带领的清华水木未名教学团队所组成,学习周期为五个半月,内容涵盖Go语言、区块链密码学、分布式编程、共识算法、公链开发、智能合约与DAPP开发、区块链系统框架开发超级账本与区块链3.0EOS等内容,现在兄弟连Go语言培训就为大家讲解一下Go面向对象5:接口的类型断言

类型断言概述

还记得大明湖畔的多态吗?——一个父类接口可以有很多不同的子类形态,骑兵步兵都是战士

当我从一个战士的集合中随意抽取一员时,它事实上是骑兵还是步兵呢

我们需要使用类型断言来加以判断——类型断言就是类型判断(翻译Go的砖家可能语死早)

类型断言的具体方式有二

类型断言方法一

在Go语言中,我们可以使用type switch语句查询接口变量的真实数据类型,语法如下:

switch x.(type) {

// cases

}

x必须是接口类型。

package main

import "fmt"

func main(){

buf := make([]interface{}, 3)

buf[0] = 5

buf[1] = 1.3

buf[2] = "无兄弟不编程"

for i := 0; i < len(buf); i++ {

    switch value := buf[i].(type){

    case int:

        fmt.Printf("%d\n", value)

    case float32:

    case float64:

        fmt.Printf("%f\n", value)

    case string:

        fmt.Printf("%s\n", value)

    default:

        fmt.Println("类型未知!")

    }

}

}

语句switch中的buf[i]必须是接口类型,变量value的类型为转换后的类型。

类型断言方法二

x.(T)

同样,x必须是接口类型。

str := value.(string)

上面的转换有一个问题,如果该值不包含一个字符串,则程序会产生一个运行时错误。为了避免这个问题,可以使用“comma, ok”的习惯用法来安全地测试值是否为一个字符串:

str, ok := value.(string)

if ok {

fmt.Printf("string value is: %q\n", str)

} else {

fmt.Printf("value is not a string\n")

}

更多区块链视频教程/源码/课件/学习资料-企鹅QUN:591229276


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

820 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传