Go语言开发-过程式编程-类型断言

栏目: Go · 发布时间: 5年前

内容简介:一个类型的方法集是指可以被该类型的值调用的所有方法的集合,对于没有方法的类型来数该集合为空。Go语言的interface{}类型用于表示空接口,即一个含有空集的方法集的类型的值。因为每个类型都有一个包含空集的方法集(不论其拥有多少方法),一个interface{}可以用于表示一个Go语言中任意类型的值。此外,我们也可以使用类型开关,或类型断言,或Go语言的reflect包中的反射将interface{}转换成其实际保存的类型的值。当我们需要处理从外部接收的数据,或希望创建一个泛型函数,或进行面向对象的编程时

5.1.2.类型断言

一个类型的方法集是指可以被该类型的值调用的所有方法的集合,对于没有方法的类型来数该集合为空。Go语言的interface{}类型用于表示空接口,即一个含有空集的方法集的类型的值。因为每个类型都有一个包含空集的方法集(不论其拥有多少方法),一个interface{}可以用于表示一个 Go 语言中任意类型的值。此外,我们也可以使用类型开关,或类型断言,或Go语言的reflect包中的反射将interface{}转换成其实际保存的类型的值。

当我们需要处理从外部接收的数据,或希望创建一个泛型函数,或进行面向对象的编程时,对interface{}类型(或自定义的interface类型)的变量的使用会非常有用。为了访问底层数据,我们可以使用类型断言,其中一种语法如下:

resultOfType, boolean := expression.(Type) // Checked
resultOfType := expression.(Type) // Unchecked; panic() on failure

如果类型断言检查成功,则返回指定的Type的值和一个用于标识成功的true。如果类型断言失败(即,表达式的类型和指定的Type不兼容),则返回指定的Type的零值和一个false。不安全的类型断言要么返回指定的Type的值,要么调用内置的panic()函数并在异常不会被恢复的情况下终止程序运行。

下面是一个简单的使用这种语法的例子。

var i interface{} = 99
var s interface{} = []string{"left", "right"}
j := i.(int) // j is of type int (or a panic() has occurred)
fmt.Printf("%T→%d\n", j, j)
if i, ok := i.(int); ok {
    fmt.Printf("%T→%d\n", i, i) // i is a shadow variable of type int
}
if s, ok := s.([]string); ok {
    fmt.Printf("%T→%q\n", s, s) // s is a shadow variable of type []string
}
int→99
int→99
[]string→["left" "right"]

做类型断言时,使用与原始变量同名的结果变量是非常常见的,即使用影子变量。通常,只有当我们希望将表达式转换为某种特定类型时才会使用类型断言。(如果表达式是多个类型之一,我们也可以使用类型开关)

请注意,如果我们打印出原始变量i和s(都是interface{}类型),它们将会以int和[]string切片的形式被打印出来。这是因为当fmt包中的函数遇到interface{}类型时,它们会足够智能的打印出实际的数据。

目录


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Clojure编程

Clojure编程

Chas Emerick、Brian Carper、Christophe Grand / 徐明明、杨寿勋 / 电子工业出版社 / 2013-3-26 / 99.00元

Clojure是一种实用的通用语言,它是传奇语言LISP的方言,可与Ruby、Python等动态语言相媲美,更以无缝Java库、服务,以及拥有JVM系统得天独厚的资源优势而胜出。本书既可以用来熟悉Clojure基础知识与常见例子,也可了解其相关的实践领域与话题,更可以看到这一JVM平台上的LISP如何帮助消除不必要的复杂性,为大家在编程实践中解决最具挑战性的问题开辟新的选择——更具灵活性,更适于W......一起来看看 《Clojure编程》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具