Interface作为go语言中一个重要的组成部分,它的使用简单方便。它的通常和struct一起使用,有点类似C++中的类。
func VarType(var interface {})(err error){今天,我们主要来讨论一下它在类型断言中的用法。
demo如下:
switch t := var.(type){ case string: //add your operations case int8: //add your operations case int16: //add your operations default: return errors.New("no this type") } } //空接口包含所有的类型,输入的参数均会被转换为空接口 //变量类型会被保存在t中
为实现这一目标,代码如下:
if t, ok := something.(I) ; ok { // 对于某些实现了接口I的 // t是其所拥有的类型 }
如果已经确定了something实现了接口I,可以直接写出下面的代码:
//在确定了something实现了接口I的情况下 //t时something所拥有的类型 //这说明ok t := something.(I)
当然,也可以封装在一个函数中:
func IsImplement(interface {}) bool{ _, ok := something.(I); return ok }
注意
something必须为接口(Interface)类型,才可以使用类型断言。假如是其他类型,使用类型断言时,需要转换,最好的方法是定义函数,封装类型断言方法。
分别运行以下代码,看看未实现特定接口的类型使用断言会发生什么:
demo1.go
type I interface{ Get() int Put(int) } //定义结构体,实现接口I type S struct { i int } func (p *S) Get() int { return p.i } func (p *S) Put(v int ) { p.i = v } //使用类型断言 func GetInt( some interface {}) int { return some.(I).Get() } func main(){ var some = &S{i:5} fmt.Println(GetInt(some)) }
demo2.go
type I interface{ Get() int Put(int) } //定义结构体,实现接口I type S struct { i int } func (p *S) Get() int { return p.i } func (p *S) Put(v int ) { p.i = v } //使用类型断言 func GetInt( some interface {}) int { return some.(I).Get() } func main(){ var i int = 5 fmt.Println(GetInt(i)) }
这就是类型断言的简单用法,这一用法在go函数源代码中出现很频繁。熟练掌握,能够更有效地阅读学习golang的源码。