去语言接口和类型如的转换方法

  介绍

小编给大家分享一下走语言接口和类型如的转换方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

去语言中使用接口断言(断言)型将接口转换成另外一个接口,也可以将接口转换为另外的类型。接口的转换在开发中非常常见,使用也非常频繁。

<强>类型断言的格式

类型断言是一个使用在接口值上的操作。语法上它看起来像我。(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,中,可以实现

去语言接口和类型如的转换方法