Interface作为go语言中一个重要的组成部分,它的使用简单方便。它的通常和struct一起使用,有点类似C 中的类。网上也有不少介绍它的使用的文章:
- Golang中Interface类型详解
- 接口(Interfaces)与反射(reflection)
今天,我们主要来讨论一下它在类型断言中的用法。
1. 用于判断变量类型
demo如下:
func VarType(var interface {})(err error){
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中
2. 判断某个接口类型是否实现了特定接口
为实现这一目标,代码如下:
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的源码。
到此这篇关于“golang学习之Interface类型断言”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
Golang interface赋值与取值的实例
Golang中对interface{}做type assertion和type switch学习笔记
go语言学习-Any类型
14. Go 语言中的类型断言是什么?
golang 接口_Golang之接口
真的理解go interface了吗?
Go语言interface详解
golang 初始化并赋值_Golang | 既是接口又是类型,interface是什么神仙用法?
Go学习--interface(接口)
golang 面试题(十三)interface内部结构和nil详解