go语言接口

接口在底层的实现有两个部分:type 和 data。

在源码中,显式地将 nil 赋值给接口时,接口的 type 和 data 都将为 nil。此时,接口与 nil 值判断是相等的。但如果将一个带有类型的 nil 赋值给接口时,只有 data 为 nil,而 type 为 nil,此时,接口与 nil 判断将不相等。

nil 在 Go语言中只能被赋值给指针和接口。

因此,go 语言中的 nil,是不一定相等,因为接口的 nil 和类型的 nil 在数据结构上一样,但是值不一样.

下面代码使用 MyImplement() 实现 fmt 包中的 Stringer 接口,这个接口的定义如下:

type Stringer interface {
    String() string
}

在 GetStringer() 函数中将返回这个接口。通过 *MyImplement 指针变量置为 nil 提供 GetStringer 的返回值。在 main() 中,判断 GetStringer 与 nil 是否相等,代码如下:

package main
import "fmt"
// 定义一个结构体
type MyImplement struct{}
// 实现fmt.Stringer的String方法
func (m *MyImplement) String() string {
    return "hi"
}
// 在函数中返回fmt.Stringer接口
func GetStringer() fmt.Stringer {
    // 赋nil,这句话只是说明 data 为 nil,但是 type 带有 *MyImplement 信息
    var s *MyImplement = nil
    // 返回变量
    //s 变量此时被 fmt.Stringer 接口包装后,实际类型为 *MyImplement,值为 nil 的接口
    return s
}
func main() {
    // 判断返回值是否为nil
    if GetStringer() == nil {
        fmt.Println("GetStringer() == nil")
    } else {
     //使用 GetStringer() 的返回值与 nil 判断时,虽然接口里的 value 为 nil,但 type 带有 *MyImplement 信息,使用 == 判断相等时,依然不为 nil。
        fmt.Println("GetStringer() != nil")
    }
}

为了避免这类误判的问题,可以在函数返回时,发现带有 nil 的指针时直接返回 nil,代码如下:

func GetStringer() fmt.Stringer {
    var s *MyImplement = nil
    if s == nil {
        return nil
    }
    return s
}

Original: https://www.cnblogs.com/burner/p/11jie-kou.html
Author: 浪客禅心
Title: go语言接口

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684032/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • idea启动 org.springframework.boot.web.server.PortInUseException: Port XXX is already in use

    win+r,输入cmd,进入命令行窗口查询占用端口号所在进程:netstat -ano|findstr 8001杀死进程:taskkill -f -pid 进程号 作者:crazy…

    技术杂谈 2023年7月24日
    091
  • 关于极限分割

    科学诸多的思潮都是由哲学引发的,当然,我说的是真正的哲学. 以前,我们探索过关于芝诺悖论问题的一些证明,继续,我们再来深入探索下极限分割的一些思想. 芝诺悖论采用了一种无限分割空间…

    技术杂谈 2023年5月31日
    0126
  • 假如,程序员面试的时候说真话

    做程序员这么长时间了,经常能够听到一句话:面试造火箭,入职拧螺丝。而且,随着就业环境越来越卷,现在只会造火箭恐怕都不行了,得能造个空间站才行。 回想自己刚毕业那会儿,哪有什么八股文…

    技术杂谈 2023年6月21日
    0132
  • 1.VMware安装CentOS

    注:以下内容适用于Windows操作系统。 一.安装VMware 带秘钥的VMware Workstation 14 Pro下载地址为: 链&#x63…

    技术杂谈 2023年7月24日
    086
  • 注意力机制是什么

    假设有一天热爱绘画的你决定去户外写生,你来到一片山坡上,极目远去,心旷神怡。头顶一片蔚蓝,脚踩一席草绿,远处山川连绵,眼前花草送香,暖阳含羞云后,轻风拂动衣襟,鸟啼虫鸣入耳,美景丹…

    技术杂谈 2023年7月11日
    0116
  • Collection和Collections有什么区别?

    1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collec…

    技术杂谈 2023年5月30日
    0112
  • CloudCanalxStarRocks在医疗大健康实时数仓领域的落地与实践

    简述 本案例为国内某大健康领域头部公司真实案例(因用户保密要求,暂不透露用户相关信息)。希望文章内容对各位读者使用 CloudCanal 构建实时数仓带来一些帮助。 业务背景 大健…

    技术杂谈 2023年7月24日
    099
  • vscode实现远程linux服务器上Python开发

    (3)在linux修改.ssh目录和authorized_keys权限。 chmod 700 .ssh chmod 600 authorized_keys (4)测试配置是否成功,…

    技术杂谈 2023年7月24日
    093
  • 置信区间的理解

    首先我们要清楚我们面对的问题是什么: 我们有一些data(X1,X2….Xn),n是样本的个数,n是固定的,这些data来自某一种分布,比方说 , 已知 ,不知道 是什…

    技术杂谈 2023年6月1日
    0138
  • MySQL学习-eclipse导入jar包

    导包先有包 !!!一定要下载和自己MySQL版本一样的jar包!!! !!!一定要下载和自己MySQL版本一样的jar包!!! !!!一定要下载和自己MySQL版本一样的jar包!…

    技术杂谈 2023年6月21日
    0130
  • Spring5新特性—Log4j2

    Spring5新特性—Log4j2 Spring5新特性—Log4j2 创建一个Maven项目,导入依赖 org.apache.logging.log4j log4j-core 2…

    技术杂谈 2023年6月21日
    0106
  • 基于UiAutomator2+PageObject模式开展APP自动化测试实战

    前言 在上一篇《APP自动化测试框架-UiAutomator2基础》中,重点介绍了uiautomator2的项目组成、运行原理、环境搭建及元素定位等基础入门知识,本篇将介绍如何基于…

    技术杂谈 2023年7月25日
    0103
  • ES5 的 setter 和 getter

    有两种方式使用 setter 和 getter 1. set/get 2. Object.defineProperty 当然,通常用 setter 和 getter 来实现私有变量…

    技术杂谈 2023年6月1日
    097
  • unity luaFramework

    1 AppConst: DebugMode: 调试模式,true:lua脚本直接读取自AssetDir,false:开始会将AssetDir内的lua脚本复制到Util.DataP…

    技术杂谈 2023年5月31日
    098
  • 浏览器端用JS实现创建和下载图片

    问题场景 在前端很多的项目中,文件下载的需求很常见。尤其是通过JS生成文件内容,然后通过浏览器端执行下载的操作。如 图片, Execl 等的导出功能。日前,项目中就遇到了这类需求,…

    技术杂谈 2023年5月31日
    0130
  • 461. Hamming Distance

    The Hamming distance between two integers is the number of positions at which the correspo…

    技术杂谈 2023年6月21日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球