分享
  1. 首页
  2. 文章

Go之断言类型(assert type)

ZhDavis · · 2747 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1.背景介绍:

笔者最近在使用一个数据结构实现多个接口,但是却发现想要在一段时间内转换成接口1,另外一段时间转换成接口2,所以也就使用到了断言类型。在看过断言类型之后,觉得还是很有必要讲一讲这个断言类型,于是便有了这篇文章。

2. 断言类型介绍:

接口类型提供一种,将接口类型转换成具体类型的转换方法,也就是断言类型(assert type)。使用方法如下所示:

1)语法一

t := i.(T)

解释说明:

T:表示的是具体的数据类型,i:表示的是接口变量i,t:表示的是转换之后的变量。

功能介绍:

这个语句实现的功能是:将接口变量i按照类型T转换成t,其中t中的值是i转换得来的,一旦转换不成功就会触发一个panic。

2)除此之外还有另外一个写法:

t, ok := i.(T)

功能介绍:

表达式里面多了一个ok,实现的功能是:将接口i按照类型T转换成t,如果类型匹配ok=true,如果类型不匹配,ok=false。改语句不会触发panic。

3)例子如下所示:

package main
import "fmt"
func main() { var i interface{} = "hello world"
 str := i.(string) // 1.接口i是string类型,会将"hello world"赋值给str fmt.Println(str)
 s, ok := i.(string) // 2.接口类型是string,会将"hello world"赋值给s,并且ok=true fmt.Println(s, ok)
 idx, ok := i.(int) // 3.接口类型不是int,ok=false,idx不会从i获取到数值 fmt.Println(idx, ok) idx = i.(int) // 4.接口i不是int类型,会触发panic fmt.Println(idx)}

Output:

hello worldhello world true0 falsepanic: interface conversion: interface {} is string, not int
goroutine 1 [running]:main.main() /tmp/sandbox277669744/prog.go:17 +0x1f4

3.断言类型的使用场景:

1)T的类型是具体类型

类型断言检查x的动态类型是否等于具体类型T。如果检查成功,类型断言返回的结果是x的动态值,其类型是T。

例子可以参考2中的例子,并无特别的不同之处。

2)T的类型是接口类型

类型断言检查x的动态类型是否满足T。如果检查成功,x的动态值不会被提取,返回值是一个类型为T的接口值。换句话说,到接口类型的类型断言,改变了表达式的类型,改变了(通常是扩大了)可以访问的方法,且保护了接口值内部的动态类型和值。

例子:

package main
import ( "fmt")
type I interface { walk()}type J interface { fly()}type A struct{}
func (a A) walk() { fmt.Println("walk!")}func (a A) fly() { fmt.Println("fly!")}func main() { var i I i = A{} // dynamic type of i is A fmt.Printf("%T\n", i.(A)) // i.fly() // 报错:./prog.go:26:6: i.fly undefined (type I has no field or method fly) var j J j = i.(J) // 这里将i中的值转换成接口J这一个类型 fmt.Printf("%T\n", j)  j.fly()}

Output:

main.Amain.Afly!


代码分析:
从上面的执行输出,我们可以看出来,接口i不能够调用fly()函数,尽管是用A{}来进行的赋值操作。接口j可以通过i来进行转换,此时j.fly()就可以被使用了。

原文:https://mp.weixin.qq.com/s/Bt3C8W2q-FeEUfy7ecRlng

公众号:灰子学技术


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

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

关注微信
2747 次点击
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏