前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang Interface空接口类型转换

Golang Interface空接口类型转换

作者头像
AsiaYe
发布2022-12-07 09:09:07
1.2K0
发布2022-12-07 09:09:07
举报
文章被收录于专栏:DBA随笔DBA随笔

Golang Interface空接口类型转换

最近工作中写Golang的代码比较多,之前对Golang不太了解,现在也是一边写一边学,慢慢的涉猎一些Golang方面的内容。今天来看看Golang中的Interface, 也就是接口

01

interface简单介绍

1、什么是接口?

interface在Golang中,是接口的意思。

接口,其实是一组方法的集合。它是一个抽象的概念,用例子来理解,就比较容易。

如下面的代码,inter,就是一个接口,并且包含2个方法,func1和func2:

代码语言:javascript
复制
import "fmt"

// inter是一个接口,包含func1和func2两个方法
type inter interface {    
    func1()    
    func2()
}

2、接口的特点

a、接口里面的方法都没有方法体,接口定义里面没有变量;

b、接口不需要显式的实现(也就是没有implement关键字),只要某个类型,实现了接口的方法,我们就说这个类型实现了接口。

如下代码,impl类型,实现了inter接口:

代码语言:javascript
复制
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()
}

输出结果如下:

代码语言:javascript
复制
impl func1
impl func2

c、接口本身不能实例化。

d、接口可以指向一个实现了该接口的自定义变量,这个变量可以是结构体,也可以是一个常见的类型,例如int,但是必须是自定义的

如下:

代码语言:javascript
复制
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)
}


输出结果如下:

代码语言:javascript
复制
myint func1
myint func2

上述代码中,变量b的类型是myint,它本质上是int类型的,myint实现了接口inter,所以变量b可以直接赋值给inter类型的变量d

e、一个自定义类型,可以实现多个接口。

f、接口之间可以继承,某个类型如果要实现子接口,需要将父接口的方法也全部实现。

g、包含0个方法的接口,称之为空接口,所有的类型,都实现了空接口。

最经典的空接口的例子,可能就是fmt.Println这个打印函数了,它的代码如下:

代码语言:javascript
复制
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类型。

正确的写法是下面这样:

代码语言:javascript
复制
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类型,输出结果:

代码语言:javascript
复制
string Test function
int 2
float64 2
this kind of type is not support

Golang接口相关的案例,其实还有很多,大家可以去官网查看。

开发做的多了,总结了一个学习方法,就是学这种开发语言和学习MySQL一样,官方文档,永远是第一手资料,指的反复咀嚼。

今天就这样吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Golang Interface空接口类型转换
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档