Golang Interface空接口类型转换
Golang Interface空接口类型转换
最近工作中写Golang的代码比较多,之前对Golang不太了解,现在也是一边写一边学,慢慢的涉猎一些Golang方面的内容。今天来看看Golang中的Interface, 也就是接口
01
interface简单介绍
1、什么是接口?
interface在Golang中,是接口的意思。
接口,其实是一组方法的集合。它是一个抽象的概念,用例子来理解,就比较容易。
如下面的代码,inter,就是一个接口,并且包含2个方法,func1和func2:
import "fmt"
// inter是一个接口,包含func1和func2两个方法
type inter interface {
func1()
func2()
}
2、接口的特点
a、接口里面的方法都没有方法体,接口定义里面没有变量;
b、接口不需要显式的实现(也就是没有implement关键字),只要某个类型,实现了接口的方法,我们就说这个类型实现了接口。
如下代码,impl类型,实现了inter接口:
import "fmt"
// inter是一个接口,包含func1和func2两个方法
type inter interface {
func1()
func2()
}
// 自定义impl类型,并实现func1方法
type impl struct{}
func (i *impl) func1() {
fmt.Println("impl func1")
}
func (i *impl) func2() {
fmt.Println("impl func2")
}
func main() {
var a = &impl{}
a.func1()
a.func2()
}
输出结果如下:
impl func1
impl func2
c、接口本身不能实例化。
d、接口可以指向一个实现了该接口的自定义变量,这个变量可以是结构体,也可以是一个常见的类型,例如int,但是必须是自定义的
如下:
type inter interface { func1()
func2()
}
// 自定义myint类型,并实现func1、func2方法
type myint int
func (m *myint) func1() {
fmt.Println("myint func1")
}
func (m *myint) func2() {
fmt.Println("myint func2")
}
func main() {
var b myint = 0
b.func1()
b.func2()
var d inter = &b
fmt.Println(d)
}
输出结果如下:
myint func1
myint func2
上述代码中,变量b的类型是myint,它本质上是int类型的,myint实现了接口inter,所以变量b可以直接赋值给inter类型的变量d
e、一个自定义类型,可以实现多个接口。
f、接口之间可以继承,某个类型如果要实现子接口,需要将父接口的方法也全部实现。
g、包含0个方法的接口,称之为空接口,所有的类型,都实现了空接口。
最经典的空接口的例子,可能就是fmt.Println这个打印函数了,它的代码如下:
import (
"fmt"
)
func main() {
//1、 fmt.Println()函数定义,传入一个any的参数
//func Println(a ...any) (n int, err error) {
// return Fprintln(os.Stdout, a...)
//}
//2、 any其实就是interface{}类型
// any is an alias for interface{} and is equivalent to interface{} in all ways.
//type any = interface{}
var a int = 0
var b float32 = 1.2
fmt.Println(a, b)
}
上述例子中,Println函数,传入any类型的参数,都可以打印。其实就是因为所有类型都实现了interface{}这个空接口,所以所有类型都可以通过fmt.Println来进行打印。
02
空接口类型转换方法
有了上面的基础,可以开始今天的主题了,如果某个函数的参数是一个空接口类型,那么这个函数可以接受任意类型的参数。
但是需要明确的一点是,空接口类型的参数可以传入任意类型,但是空接口 不等于 其他类型。
如果某个函数,使用了空接口作为参数,而我们想获取参数并执行相关操作(例如字符串截取,数字自增等)的话,就需要知道参数的真实类型, 然后才能做具体的操作,否则代码有可能直接panic。
先来看一段有问题的代码:
我们在main函数中调用inter2Type函数,参数传入数字1,然后这个函数是对数字1进行加1操作。可以发现,语法提示interface{}类型不能直接进行自增操作,因为它不是int类型。
正确的写法是下面这样:
func interface2Type(i interface{}) {
switch i.(type) {
case string:
fmt.Println("string", i.(string)+" function")
break
case int:
fmt.Println("int", i.(int)+1)
break
case float64:
fmt.Println("float64", i.(float64)+1.0)
break
default:
fmt.Println("this kind of type is not support")
}
}
func main() {
interface2Type("Test")
interface2Type(1)
interface2Type(1.0)
var a float32 = 1
interface2Type(a)}
先判断下interface{}参数的真实类型,然后再进行对应的操作。
如果是string,则拼接;如果是int或者float64,则加1 。
这里,我们的函数只兼容string,int,float64这3种类型,其实数据类型远不止这么多,如果还有其他类型的函数,我们可以在switch case语句中,设置default函数来过滤其他类型。例如上述例子中,最后我们传入的float32类型,输出结果:
string Test function
int 2
float64 2
this kind of type is not support
Golang接口相关的案例,其实还有很多,大家可以去官网查看。
开发做的多了,总结了一个学习方法,就是学这种开发语言和学习MySQL一样,官方文档,永远是第一手资料,指的反复咀嚼。
今天就这样吧。
相关文章
- 叮咚,织梦dedecms转换插件为您节省5800元(免费提供协助)
- JsonArray转换List
- Golang中Int32转换为int16丢失精度的具体过程
- uint32 java_关于Java的int和C的uint32之间的转换
- set和list转换_list和set
- java将有父子关系的list转换为树形结构
- 数据结构实验之栈与队列一:进制转换(SDUT 2131)
- MySQL时间戳转换:给出精准答案(mysql时间戳的转换)
- Linux函数atoi:将字符串转换为整数(linuxatoi)
- MySQL中将int类型转换为其他类型(mysql转换int)
- 从Oracle到SQL Server:数据库转换全攻略(oracle转mssql)
- Effortlessly Convert Your Images on Linux with These Top Tools(linux图片格式转换)
- SQL Server中如何转换数据格式(sqlserver转格式)
- Oracle中灵活转换列为行(oracle中将列转为行)
- PHP时间转换Unix时间戳代码
- Json字符串转换为JS对象的高效方法实例
- Javascript函数parseInt()转换时出现bug问题