返回顶部
首页 > 资讯 > 后端开发 > GO >Golang接口的定义与空接口及断言怎么使用
  • 409
分享到

Golang接口的定义与空接口及断言怎么使用

2023-07-06 01:07:20 409人浏览 薄情痞子
摘要

这篇文章主要讲解了“golang接口的定义与空接口及断言怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang接口的定义与空接口及断言怎么使用”吧!1. Golang中的接口在G

这篇文章主要讲解了“golang接口的定义与空接口及断言怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang接口的定义与空接口及断言怎么使用”吧!

1. Golang中的接口

在Go语言中接口(interface)是一种类型,一种抽象的类型。

接口(interface)定义了一个对象的行为规范, 只定义规范不实现 ,由具体的对象来实现规范的细节 。

实现接口的条件:

一个对象只要全部实现了接口中的方法 ,那么就实现了这个接口。换句话说,接口就是一个需要实现的方法列表。

2. 为什么要使用接口

下面的代码中定义了猫和狗,然后它们都会叫,你会发现main函数中明显有重复的代码

如果我们后续再加上猪、青蛙等动物的话,我们的代码还会一直重复下去

那我们能不能把它们当成“能叫的动物”来处理呢?

type Cat struct {  Name string}func (c Cat) Say() string {   return c.Name + ":喵喵喵" }type Dog struct {  Name string}func (d Dog) Say() string {   return d.Name + ": 汪汪汪" }func main() {    c := Cat{Name: "小白猫"} // 小白猫:喵喵喵    fmt.Println(c.Say())    d := Dog{"阿黄"}    fmt.Println(d.Say()) // 阿黄: 汪汪汪}

3. 定义一个Usber接口(从下往上转换)

定义一个 Usber 接口让 Phone 和 Computer 结构体实现这个接口

//1.接口是一个规范type Usber interface {    getName() string}//2.如果接口里面有方法的话,必要要通过结构体或者通过自定义类型实现这个接口type Phone struct {    Name string}type Computer struct {    Brand string}func (c *Computer) getName() string {    return c.Brand}//3.手机要实现usb接口的话必须得实现usb接口中的所有方法func (p *Phone) getName() string {    return p.Name}func main() {    p := &Phone{    Name: "华为手机",    }    c := &Computer{    Brand: "联想电脑",    }    var p1 Usber // golang中接口就是一个数据类型    p1 = p // 表示手机实现Usb接口    fmt.Println(p1.getName())    //接口使用场景,处理相同类型的数据    newName := transData(p)    newName1 := transData(c)    fmt.Println(newName, newName1)    }    func transData(usber Usber) string {        name := usber.getName()        return fmt.Sprintf("%s%s", name, "处理后")}

当我们要去处理同一数据类型的时候这个数据的时候,比如猫 狗是同一类数据类型。

k8s的deployment,pod,configmap,secretd等等这些资源的时候,它都是k8s的一个资源,在获取列表的时候会对其做数据处理,比如要对其进行数据排序,那么只需要对这个接口进行排序就行了,不需要对每个资源都去写一遍排序的方法,那么这样不是很冗余吗?

4. 空接口

1. 空接口说明

  • Golang中空接口也可以直接当做类型来使用,可以表示任意类型 (泛型概念,最大的特点)

  • Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。

  • 空接口表示没有任何约束,因此任何类型变量都可以实现空接口。

  • 空接口在实际项目中用的是非常多的,用空接口可以表示任意数据类型

2. 空接口作为函数的参数

//空接口作为函数的参数func show(a interface{}) {    fmt.Printf("值:%v 类型:%T\n", a, a) }    func main() {     show(20) // 值:20 类型:int     show("你好golang") // 值:你好golang 类型:string     slice := []int{1, 2, 34, 4}     show(slice) // 值:[1 2 34 4] 类型:[]int     }

printf println是可以接受任何参数的,func Printf(fORMat string , a ...interface{})可以看到这里可以接受任何空接口类型,...类似于切片类型。

func test(a int, b ...interface{}) {    for _, v := range b {        fmt.Printf("%v,%T \n", v, v)    }}func main() {    test(1, "a", 22, []string{"1"})}a,string 22,int [1],[]string

3. 切片实现空接口

切片和map是同一类型的元素,有了空接口,在同一个切片同一个map中就可以将任何类型的数据放进去。

func main() {     var slice = []interface{}{"张三", 20, true, 32.2}    fmt.Println(slice) // [张三 20 true 32.2] }

4. map 的值实现空接口

func main() { // 空接口作为 map 值 var studentInfo = make(map[string]interface{}) studentInfo["name"] = "张三" studentInfo["age"] = 18 studentInfo["married"] = falsefmt.Println(studentInfo) // [age:18 married:false name:张三] }

类型断言(从上往下转换,接口类型转化为具体类型)

  • 一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的。

  • 这两部分分别称为接口的动态类型和动态值。(一个空接口,可以是结构体,指针,布尔各种类型。它其实是动态的,你传递什么都可以,这就叫做动态类型和动态值)

  • 如果我们想要判断空接口中值的类型,那么这个时候就可以使用类型断言

  • 其语法格式: x.(T)

x : 表示类型为 interface{}的变量

T : 表示断言 x 可能是的类型

断言返回两个值,一个是断言是否转化成果,一个是转化结果,注意空接口类型是空接口类型。

    var str interface{}    str = "hello"    str = str + "sss"  //这样写是会报错的,因为空接口类型不是字符串类型,需要断言转化才可以
type test1 struct {    name string    age  int}func main() {    var t interface{}    //未断言前没有结构体的特征,需要断言转化为结构体指针    t = &test1{        name: "hh",        age:  12,    }    v, ok := t.(*test1)  //这里其实就是做了一个类型转化,这里的类型就变为来结构体指针类型    if ok {        fmt.Printf("类型:%T 值:%#v\n", v, v)    } else {        fmt.Println("xxx")    }}类型:*main.test1 值:&main.test1{name:"hh", age:12}

转化为具体类型之后,那么具体类型的方法是都可以去调用的,空接口是不能访问属性和方法的。转化为具体的类型之后就可以访问其属性和方法。

值接收者和指针接收者(节省内存)

1. 值接收者

当方法作用于值类型接收者时,Go语言会在代码运行时将接收者的值复制一份。

在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本,无法修改接收者变量本身。

type Usb interface {     Start()     Stop() }type Phone struct { Name string }func (p Phone) Start() {fmt.Println(p.Name, "开始工作") }func (p Phone) Stop() {fmt.Println("phone 停止") }func main() {     phone1 := Phone{  // 一:实例化值类型     Name: "小米手机",     }    var p1 Usb = phone1 //phone1 实现了 Usb 接口 phone1 是 Phone 类型     p1.Start()         phone2 := &Phone{ // 二:实例化指针类型       Name: "苹果手机",     }    var p2 Usb = phone2 //phone2 实现了 Usb 接口 phone2 是 *Phone 类型     p2.Start() //苹果手机 开始工作 }
2. 指针接收者
  • 指针类型的接收者由一个结构体的指针组成

  • 由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。

  • 这种方式就十分接近于其他语言中面向对象中的 this 或者 self 。

  • 例如我们为 Person 添加一个 SetAge 方法,来修改实例变量的年龄。

3. 指针类型接收者

使用时机

注:并不是所有情况下都希望修改数据

  • 需要修改接收者中的值

  • 接收者是拷贝代价比较大的大对象

  • 保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。

从使用场景上面来说,基本上都会使用指针,如果使用了第三方的包,第三方包的某些返回值它只是一个值类型,所以第三方类型返回什么类型我们就使用什么类型,针对第三方包。

感谢各位的阅读,以上就是“Golang接口的定义与空接口及断言怎么使用”的内容了,经过本文的学习后,相信大家对Golang接口的定义与空接口及断言怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: Golang接口的定义与空接口及断言怎么使用

本文链接: https://lsjlt.com/news/356850.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang接口的定义与空接口及断言怎么使用
    这篇文章主要讲解了“Golang接口的定义与空接口及断言怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang接口的定义与空接口及断言怎么使用”吧!1. Golang中的接口在G...
    99+
    2023-07-06
  • Golang接口的定义与空接口及断言的使用示例
    目录1. Golang中的接口2. 为什么要使用接口3. 定义一个Usber接口(从下往上转换)4. 空接口1. 空接口说明2. 空接口作为函数的参数3. 切片实现空接口4. map...
    99+
    2023-05-15
    Go接口的定义 Go空接口 Go断言
  • golang的接口怎么定义使用
    这篇文章主要讲解了“golang的接口怎么定义使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang的接口怎么定义使用”吧!在golang中,接口是一种类型,是用来将对方法进行一个收...
    99+
    2023-07-04
  • Golang空接口与类型断言的实现
    目录空接口定义使用场景空接口几个要注意的坑类型断言Go语言中类型断言的两种语法类型断言配合 switch 使用空接口 定义 空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没...
    99+
    2024-04-02
  • JavaSE中抽象类与接口怎么定义及使用
    这篇文章主要介绍“JavaSE中抽象类与接口怎么定义及使用”,在日常操作中,相信很多人在JavaSE中抽象类与接口怎么定义及使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaSE中抽象类与接口怎么定义...
    99+
    2023-07-02
  • golang接口断言的使用方法是什么
    在Go中,接口断言是一种将接口类型的值转换为其他具体类型的方法。接口断言可以使用类型断言表达式来进行,其语法为: value, ok...
    99+
    2023-10-23
    golang
  • golang中的空接口怎么用
    这篇文章给大家分享的是有关golang中的空接口怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、空接口Golang 中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。空接口表示,没有任何约束,...
    99+
    2023-06-14
  • Java抽象类与接口怎么定义使用
    这篇文章主要介绍“Java抽象类与接口怎么定义使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java抽象类与接口怎么定义使用”文章能帮助大家解决问题。1.对象的比较两个对象要进行比较之前,我们首...
    99+
    2023-06-30
  • typeScript的interface接口怎么定义使用
    这篇“typeScript的interface接口怎么定义使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“typeScri...
    99+
    2023-06-29
  • Golang中的接口怎么定义和实现
    在Golang中,接口定义的方式非常简单,只需要使用关键字type和interface即可。接口定义了一组方法的集合,任何类型只要实...
    99+
    2024-03-13
    Golang
  • java接口怎么定义与实现
    今天小编给大家分享一下java接口怎么定义与实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。本教程操作环境:windows...
    99+
    2023-06-30
  • C#接口怎么定义
    这篇文章主要介绍“C#接口怎么定义”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#接口怎么定义”文章能帮助大家解决问题。C# 接口(Interface)接口定义了所有类继承接口时应遵循的...
    99+
    2023-06-17
  • TypeScript怎么定义接口
    这篇文章主要讲解了“TypeScript怎么定义接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“TypeScript怎么定义接口”吧!接口的作用:接口,英文:interface,其作用可以...
    99+
    2023-06-20
  • Golang接口的定义和用法详解
    Golang接口的定义和用法详解 在Go语言中,接口(interface)是一种定义对象行为、抽象对象的方法集合的类型。接口定义了对象应该具备的方法,而不需要指定这些方法是如何实现的。...
    99+
    2024-03-06
    go语言 lsp
  • golang中的空接口使用详解
    目录1、空接口2、类型断言3、结构体值接收者和指针接收者实现接口的区别4、一个结构体实现多个接口5、接口嵌套6、Golang中空接口和类型断言使用细节1、空接口 Golang 中的接...
    99+
    2024-04-02
  • 详解JavaSE中抽象类与接口的定义及使用
    目录一、抽象类1、抽象类定义2、抽象方法二、接口1、接口定义2、类实现接口3、接口与多态联合4、extends和implements5、接口在开发当中的作用6、is has like...
    99+
    2024-04-02
  • Go语言接口类型怎么定义
    今天小编给大家分享一下Go语言接口类型怎么定义的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。接口接口是用来定义行为的类型,定...
    99+
    2023-07-05
  • Java中的接口与继承怎么定义
    这篇文章主要讲解了“Java中的接口与继承怎么定义”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的接口与继承怎么定义”吧!假设我有很多个类,分别是Mysql.java、SQLSer...
    99+
    2023-06-17
  • golang空接口的用途是什么
    Golang的空接口(interface{})可以接受任意类型的值作为参数,因此可以用于以下几种情况: 参数类型不确定:当函数或...
    99+
    2024-02-29
    golang
  • C#中怎么定义接口
    C#中怎么定义接口,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C#接口定义之声明接口声明接口在语法上和声明抽象类完全相同,例如这里有一个银行账户的接口:public&nb...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作