小编给大家分享一下走语言接口和类型如的转换方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
去语言中使用接口断言(断言)型将接口转换成另外一个接口,也可以将接口转换为另外的类型。接口的转换在开发中非常常见,使用也非常频繁。
<强>类型断言的格式强>
类型断言是一个使用在接口值上的操作。语法上它看起来像我。(T)被称为断言类型,这里我表示一个接口的类型和T表示一个类型。一个类型断言检查它操作对象的动态类型是否和断言的类型匹配。
类型断言的基本格式如下:
T:=我。(T)
其中,我代表接口变量,T代表转换的目标类型,T代表转换后的变量。
这里有两种可能。第一种,如果断言的类型T是一个具体类型,然后类型断言检查我的动态类型是否和T相同。如果这个检查成功了,类型断言的结果是我的动态值,当然它的类型是T .换句话说,具体类型的类型断言从它的操作对象中获得具体的值。如果检查失败,接下来这个操作会抛出恐慌,例如:
var w io。作家
w=操作系统。Stdout
f:=w。(* os.File)//成功:f==操作系统。Stdout
c:=w。(* bytes.Buffer)//死机:接口保存* os.file,而不是*字节。缓冲
第二种,如果相反断言的类型T是一个接口类型,然后类型断言检查是否我的动态类型满足T .如果这个检查成功了,动态值没有获取到,这个结果仍然是一个有相同类型和值部分的接口值,但是结果有类型T .换句话说,对一个接口类型的类型断言改变了类型的表述方式,改变了可以获取的方法集合(通常更大),但是它保护了接口值内部的动态类型和值的部分。
在下面的第一个类型断言后,w和rw都持有操作系统。Stdout因此它们每个有一个动态类型*操作系统。文件,但是变量w是一个io。作家类型只对外公开出文件的编写方法,然而rw变量也只公开它的阅读方法。
var w io。作家
w=操作系统。Stdout
rw:=w。(io.ReadWriter)//成功:*操作系统。文件具有读写功能
w=new (ByteCounter)
rw=w。(io.ReadWriter)//死机:*字节计数器没有读取方法
如果断言操作的对象是一个零接口值,那么不论被断言的类型是什么这个类型断言都会失败。几乎不需要对一个更少限制性的接口类型(更少的方法集合)做断言,因为它表现的就像赋值操作一样,除了对于零接口值的情况。
如果我没有完全实现T接口的方法,这个语句将会触发宕机。触发宕机不是很友好,因此上面的语句还有一种写法:
T, ok:=我。(T)
这种写法下,如果发生接口未实现时,将会把好的置为false, T置为T类型的0值。正常实现时,好为真的。这里好可以被认为是:我接口是否实现T类型的结果。
<强>将接口转换为其他接口强>
实现某个接口的类型同时实现了另外一个接口,此时可以在两个接口间转换。
鸟和猪具有不同的特性,鸟可以飞,猪不能飞,但两种动物都可以行走。如果使用结构体实现鸟和猪,让它们具备自己特性的()和()方走飞法就让鸟和猪各自实现了飞行动物接口(传单)和行走动物接口(沃克)。
将鸟和猪的实例创建后,被保存到接口{}类型的地图中.interface{}类型表示空接口,意思就是这种接口可以保存为任意类型。对保存有鸟或猪的实例的接口{}变量进行断言操作,如果断言对象是断言指定的类型,则返回转换为断言对象类型的接口,如果不是指定的断言类型时,断言的第二个参数将返回假,例如下面的代码:
var=new obj接口(鸟)
f, isFlyer:=obj。(传单)
代码中,新(鸟)产生*鸟类型的鸟实例,这个实例被保存接口在{}类型的obj变量中。使用obj。(传单)类型断言,将obj转换为传单接口.f为转换成功时的传单接口类型,isFlyer表示是否转换成功,类型就是bool。
下面是详细的代码(代码1):
package 主要 import “fmt"//,定义飞行动物接口 type Flyer  interface { 飞() }//,定义行走动物接口 type Walker  interface { 走() }//,定义鸟类 type bird  struct { }//,实现飞行动物接口 func (b *鸟),飞(),{ fmt.Println(“鸟:,fly") }//,为鸟添加走()方法,,实现行走动物接口 func (b *鸟),走(),{ fmt.Println(“鸟:,walk") }//,定义猪 type pig  struct { }//,为猪添加走()方法,,实现行走动物接口 func (p *猪),走(),{ fmt.Println(“猪:walk") } func main (), {//,创建动物的名字到实例的映射 animals :=, map [string]接口{}{ “bird":新(鸟), “pig":新(猪) }//,遍历映射 名字,for obj :=, range animals {//,判断对象是否为飞行动物 f, isFlyer :=, obj。(传单)//,判断对象是否为行走动物 w, isWalker :=, obj。(沃克) fmt.Printf(“名称:% s isFlyer:, % v isWalker:, % v \ n",,名字,,isFlyer,, isWalker)//,如果是飞行动物则调用飞行动物接口 if isFlyer  { f.Fly () }//,如果是行走动物则调用行走动物接口 if isWalker  { w.Walk () } } } 代码说明如下: 第,6,行定义了飞行动物的接口。 第,11,行定义了行走动物的接口。 第,16,和,30,行分别定义了鸟和猪两个对象,并分别实现了飞行动物和行走动物接口。 第,41岁,行是一个,地图,映射对象名字和对象实例,实例是鸟和猪。 第,47岁,行开始遍历,地图,obj 为,接口{},接口类型。 第,50,行中,使用类型断言获得,f类型为,Flyer 及,isFlyer 的断言成功的判定。 第,52岁,行中,使用类型断言获得,w,类型为,Walker 及,isWalker 的断言成功的判定。 第,57岁,和,62,行,根据飞行动物和行走动物两者是否断言成功,调用其接口。 代码输出如下: 名称:,pig isFlyer: false isWalker:,真的 猪:走 名称:,bird isFlyer: true isWalker:,真的 鸟:飞 鸟:走 将接口转换为其他类型 在代码,1,中,可以实现去语言接口和类型如的转换方法