iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang中的interface怎么使用
  • 598
分享到

Golang中的interface怎么使用

2023-06-27 10:06:41 598人浏览 独家记忆
摘要

这篇文章主要讲解了“golang中的interface怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中的interface怎么使用”吧!万能类型interface在Jav

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

万能类型interface

Java以及其他语言当中接口是一种写法规范,而在golang当中,interface其实也是一种值,它可以像是值一样传递。并且在它的底层,它其实是一个值和类型的元组。

这里我们来看下golang官方文档当中的一个例子:

package mainimport ( "fmt" "math")type I interface { M()}type T struct { S string}func (t *T) M() { fmt.Println(t.S)}type F float64func (f F) M() { fmt.Println(f)}func main() { var i I i = &T{"Hello"} describe(i) i.M() i = F(math.Pi) describe(i) i.M()}func describe(i I) { fmt.Printf("(%v, %T)\n", i, i)}

在上面的代码当中定义了一个叫做describe的方法,在这个方法当中我们输出了两个值,一个是接口i对应的值,另一个是接口i的类型。

可以看到接口当中既存储了对应的结构体的实例的信息,也存储了结构体的类型。因此interface可以理解成一种特殊的类型。

实际上也的确如此,我们可以把interface理解成一种万能数据类型,它可以接收任何类型的值。我们看下下面这种用法:

var a1 interface{} = 1var a2 interface{} = "abc"list := make([]interface{}, 0)list = append(list, a1)list = append(list, a2)fmt.Println(list)

在代码当中我们创建了一个interface{}类型的slice,它可以接收任何类型的值和实例。另外我们用interface{}这个类型也可以接收任何结构体的值。这里可能会有些迷惑,其实很容易想明白。interface表示一种类型,可以接收任何实现了interface当中规定的方法的类型的值。当我们定义inteface{}的时候,其实是定义了空的interface,相当于不需要实现任何方法的空interface,所以任何类型都可以接收,这也就是它成为万能类型的原因。

我们接收当然没有问题,问题是我们怎么使用这些interface类型的值呢?

一种方法是我们可以判断一个interface的变量类型。判断的方法非常简单,我们在interface的变量后面用.(type)的方法来判断。它和mapkey值判断一样,会返回一个值和bool类型的标记。我们可以通过这个标记判断这个类型是否正确。

if v, ok := a1.(int); ok {    fmt.Println(v)}

如果类型比较多的话使用switch也是可以的:

switch v := i.(type) {case int:    fmt.Println("int")case string:    fmt.Println("string")}

空值nil

interface类型的空值是nil,和python当中的None是一个意思,表示一个指针指向空。如果我们在Java或者是其他语言当中对一个空指针调用方法,那么会触发NullPointerMethodError,也就是空指针报错。这也是我们初学者在编程当中最容易遇到的错误,往往原因是忘记了对声明进行初始化导致的。

但是在golang当中不会,即使是nil也可以调用interface的方法。举个例子:

type T struct { S string}func (t *T) M() { fmt.Println(t.S)}func main() { var i I var t *T i = t i.M()}

我们将t赋值给了i,问题是t并没有进行初始化,所以它是一个nil,那么我们的i也就会是一个nil。我们对nil调用M方法,在M方法当中我们打印了t的局部变量S。由于t此刻是一个nil,它并没有这个变量,所以会引发一个invalid memory address or nil pointer derefernce的错误,也就是对空指针进行寻址的错误。

要解决这个错误,其实很简单,我们可以在M方法当中对t进行判断,如果发现t是一个nil,那么我们则跳过执行的逻辑。当我们把M函数改成这样之后,就不会触发空指针的问题了。

func (t *T) M() {    if t == nil {        fmt.Println("nil")        return    } fmt.Println(t.S)}

nil触发异常的问题也是初学者经常遇到的问题之一,这也要求我们在实现结构体内方法的时候一定要记得判断调用的对象是否为nil,避免不必要的问题。

赋值的类型选择

我们都知道golang当中通过interface来实现多态,只要是实现了interface当中定义的函数,那么我们就可以将对应的实例赋值给这个interface类型。

这看起来没有问题,但是在实际执行的时候仍然会有一点点小小的问题。比如说我们有这样一段代码:

type Integer inttype Operation interface { Less(b Integer) bool Add(b Integer)}func (a Integer) Less(b Integer) bool { return a < b}func (a *Integer) Add(b Integer) { *a += b}

这段代码非常简单,我们定义了一个Operationinterface,并且实现了Integer类型的两个方法。表面上看一切正常,但是有一个细节。LessAdd这两个方法针对的类型是不同的,Less方法我们不需要修改原值,所以我们传入的是Integer的值,而Add方法,我们需要修改原值, 所以我们传入的类型是Integer的指针。

那么问题来了,这两个方法的类型不同, 我们还可以将它的值赋值给Operation这个interface吗?如果可以的话,我们应该传递的是值还是指针呢?下面代码当中的第二行和第三行究竟哪个是正确的呢?

var a Integer = 1var b Operation = &avar b Operation = a

答案是第二行的是正确的,原因也很简单,因为我们传入指针之后,golang的编译器会自动生成一个新的Less方法。在这个转换了类型的方法当中去调用了原本的方法,相当于做了一层中转。

func (a *Integer) Less(b Integer) bool{    return (*a).Less(b)}

那反过来行不行呢?我们也写出代码:

func (a Integer) Add (b Integer) {    (&a).Add(b)}

显然这样是不行的,因为函数执行之后修改的只能是Add这个方法当中a这个参数的值,而没办法修改原值。这和我们想要的不符合,所以golang没有选择这种策略。

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

您可能感兴趣的文档:

--结束END--

本文标题: Golang中的interface怎么使用

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang中的interface怎么使用
    这篇文章主要讲解了“Golang中的interface怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中的interface怎么使用”吧!万能类型interface在Jav...
    99+
    2023-06-27
  • GoLang nil与interface的空指针怎么使用
    本篇内容介绍了“GoLang nil与interface的空指针怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!nilGo中...
    99+
    2023-07-04
  • 怎么使用Java中的abstract和interface
    本篇内容介绍了“怎么使用Java中的abstract和interface”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、简介abstrac...
    99+
    2023-06-25
  • 介绍Golang中interface的用法
    Go 是一个强类型编程语言,与其他编程语言不同的是,它具有一个接口(interface)类型,它允许定义一个或多个方法的签名,但没有实现。通过实现该接口的方法,可以将具有不同数据类型的不同类型的对象赋值给相同的接口类型并进行处理,使编程变得...
    99+
    2023-05-14
  • Golang中的Interface详解
    背景: golang的interface是一种satisfied式的。A类只要实现了IA interface定义的方法,A就satisfied了接口IA。更抽象一层,如果某些设计上需...
    99+
    2024-04-02
  • interface在java中怎么使用
    在Java中,可以使用关键字"interface"来定义一个接口。接口是一种抽象类型,它只定义了方法的签名和常量的声明,而没有具体实...
    99+
    2023-08-31
    Java interface
  • golang interface的作用是什么
    Go语言中的接口(interface)是一种抽象类型,它定义了一组方法的集合。接口定义了对象的行为和功能,而不关心对象的具体实现。 ...
    99+
    2023-10-20
    golang
  • golang 多个interface怎么组合
    可以通过创建包含多个接口的聚合类型来组合接口。该类型定义为一个结构体,包含所有接口。然后,为每个接口提供方法实现,以使聚合类型实现这些接口。现在,聚合类型可以像普通接口一样使用,访问多个...
    99+
    2024-04-21
    golang
  • Golang中interface的基本用法详解
    目录概述基本使用Java 中的 interface(接口)go 中的 interface(接口)go interface 的优势空接口如何使用 interface{} 类型的参数?类...
    99+
    2023-01-04
    Golang interface用法 Golang interface
  • golang interface多态怎么实现
    在Go语言中,通过接口可以实现多态。接口是一种抽象类型,它定义了一组方法的签名。任何类型只要实现了接口中定义的方法,就可以被看作是该...
    99+
    2024-02-29
    golang
  • Golang中interface{}的注意事项是什么
    这篇“Golang中interface{}的注意事项是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang中int...
    99+
    2023-07-05
  • Go语言中interface类型怎么使用
    今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Go语言中int...
    99+
    2023-07-06
  • golang中通过interface{}的通用结构图
    一分耕耘,一分收获!既然打开了这篇文章《golang中通过interface{}的通用结构图》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的...
    99+
    2024-04-04
  • TypeScript中的class和interface怎么用
    这篇文章主要介绍了TypeScript中的class和interface怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇TypeScript中的class和interface怎么用文章都会有所收获,下面我们...
    99+
    2023-06-27
  • 怎么在Golang中将interface{}转换为数组
    怎么在Golang中将interface{}转换为数组?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。golang适合做什么golang可以做服务器端开发,但golang很适合做...
    99+
    2023-06-14
  • php interface怎么定义和使用
    在PHP中,可以使用interface关键字来定义一个接口。接口是一种规范,用于定义类应该实现的方法。一个类可以实现一个或多个接口,...
    99+
    2023-10-22
    php
  • C#中interface如何使用
    今天就跟大家聊聊有关C#中interface如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C# interface定义:就是以前使用的类似于API 的东西,别人告诉你一个类型...
    99+
    2023-06-17
  • golang interface类型转换怎么实现
    在Go语言中,可以通过类型断言来实现接口类型的转换。 使用类型断言的语法为: value, ok := interfaceVar.(...
    99+
    2023-10-20
    golang
  • Golang中interface{}转为数组的操作
    interface{} 转为普通类型 我们都知道在golang中interface{}可以代表任何类型,对于像int64、bool、string等这些简单类型,interface{}...
    99+
    2024-04-02
  • 详解Golang中interface{}的注意事项
    目录interface {} 可以用于模拟多态interface{} 需要注意空和非空的情况iface结构体,非空eface结构体interface {} 可以用于模拟多态 xdm ...
    99+
    2023-03-08
    Golang interface{}注意实现 Golang interface{} Golang interface Go interface
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作