Go nil 空结构体 空接口有什么区别?

简介: 本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。

1 Go nil 空结构体 空接口有什么区别?

1.1 nil是一个零值变量

从定义可以看出nil是一个预定义的变量,并且是以下类型的变量:

指针、管道、函数、接口、Map、切片

python

代码解读

复制代码

// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type

1.2 空结构体

1.2.1 大小为0

1.2.2 都指向同一个地址zerobase(不被包含在其他结构体中时)

runtime\malloc.go

go

代码解读

复制代码

// base address for all 0-byte allocations
var zerobase uintptr

1.2.3 作为结构体字段的偏移

  1. 只有一个空接口体字段时

结构体本身和其字段都指向zerobase

  1. 当有其他字段时,并且空结构体字段处于第一个字段时

空结构体字段和整个变量的地址及第二个字段的地址一样

  1. 当有其他字段时,并且空结构体字段处于中间字段时

空结构体字段的地址会紧跟前一个字节的末尾

  1. 当有其他字段时,并且空结构体字段处于最后字段时

空结构体字段的地址会紧跟前一个字节的末尾,但会进行填充,并且填充长度与前一个字段相同。

1.3 空接口

空接口的底层实现是eface,_type字段存储具体对象的类型,data字段存储具体对象的值

rust

代码解读

复制代码

type eface struct {
    _type *_type    // 
    data  unsafe.Pointer // 
}

细节:只有当eface的两个字段都为nil时,eface才为nil


转载来源:https://juejin.cn/post/7431201720108515365

相关文章
|
2月前
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
29 7
|
2月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
37 5
|
2月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
Unix 编译器 Go
|
3月前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
39 0
|
3月前
|
存储 安全 程序员
|
3月前
|
存储 Go 数据处理
C 数组和 Go 切片的区别详解
【8月更文挑战第31天】
34 0
|
3月前
|
存储 设计模式 Go
深入理解Go语言的接口
【8月更文挑战第31天】
15 0
|
关系型数据库 应用服务中间件 测试技术
记一次从Rails至Golang的接口迁移
初创公司常会选择类似Rails这样的框架进行业务的快速开发,但Rails存在并发性低的弱点,随着业务量的提升,有可能出现性能上的问题。这时,往往需要将一部分高频调用的接口使用一种并发性更好的技术(如openresty, golang, erlang, scala...)加以改造,本文总结了将一个线上高频访问的接口服务从Rails改造为Golang实现的实战经验。
5216 0