Go的nil切片与空切片一样吗?这么答,面试官让回去等信儿
Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如:整型和浮点型变量的默认值为0。字符串变量的默认值为空字符串。布尔型变量默认为false
。切片、函数、指针变量的默认为nil
。
一个 nil 切片和空切片的定义如下
var s1 []int // nil切片
s2 := []int{} // 空切片,或者用 make([]int,0
好了,不能再多说了,再多说答案就出来了,接下来直接看问题。
问题
nil
切片和空切片一样吗?如果不一样区别是什么,先看下下面这个描述问题的代码。
package mainimport ("fmt""reflect""unsafe"
)func main() {var s1 []ints2 := make([]int,0)s4 := make([]int,0)fmt.Printf("s1 pointer:%+v, s2 pointer:%+v, s4 pointer:%+v, \n", *(*reflect.SliceHeader)(unsafe.Pointer(&s1)),*(*reflect.SliceHeader)(unsafe.Pointer(&s2)),*(*reflect.SliceHeader)(unsafe.Pointer(&s4)))fmt.Printf("%v\n", (*(*reflect.SliceHeader)(unsafe.Pointer(&s1))).Data==(*(*reflect.SliceHeader)(unsafe.Pointer(&s2))).Data)fmt.Printf("%v\n", (*(*reflect.SliceHeader)(unsafe.Pointer(&s2))).Data==(*(*reflect.SliceHeader)(unsafe.Pointer(&s4))).Data)
}
nil切片和空切片指向的地址一样吗?这个代码会输出什么?
怎么答
nil切片和空切片指向的地址不一样。nil空切片引用数组指针地址为0(无指向任何实际地址)
空切片的引用数组指针地址是有的,且固定为一个值
s1 pointer:{Data:0 Len:0 Cap:0}, s2 pointer:{Data:824634207952 Len:0 Cap:0}, s4 pointer:{Data:824634207952 Len:0 Cap:0},
false //nil切片和空切片指向的数组地址不一样
true //两个空切片指向的数组地址是一样的,都是824634207952
解释
之前在前面的文章里提到过切片的数据结构为
type SliceHeader struct {Data uintptr //引用数组指针地址Len int // 切片的目前使用长度Cap int // 切片的容量
}
nil切片和空切片最大的区别在于指向的数组引用地址是不一样的。
所有的空切片指向的数组引用地址都是一样的
本篇面试题解,转载自公众号「小白debug」,如果喜欢它的文章内容,可以点击下方名片关注。
Go的nil切片与空切片一样吗?这么答,面试官让回去等信儿相关推荐
- Go 学习笔记(11)— 切片定义、切片初始化、数组和切片差异、字符串和切片转换、len()、cap()、空 nil 切片、append()、copy() 函数、删除切片元素
1. 切片定义 Go 语言切片是对数组的抽象. Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容 ...
- golang nil切片与空切片
var slice []int 创建出来的 slice 其实是一个 nil slice.它的长度和容量都为0.和nil比较的结果为true.这里比较混淆的是empty slice,empty slic ...
- 2.4 Go语言基础之切片
本文主要介绍Go语言中切片(slice)及它的基本使用. 一.引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x [3]int) ...
- 深度解密Go语言之Slice
Go 语言的 slice 很好用,不过也有一些坑.slice 是 Go 语言一个很重要的数据结构.网上已经有很多文章写过了,似乎没必要再写.但是每个人看问题的视角不同,写出来的东西自然也不一样.我这篇 ...
- 深入解析 Go 中 Slice 底层实现
转载地址:https://mp.weixin.qq.com/s/8b6FudzXStKN3d6p8wYSqQ 切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合.切片的设计想法是由 ...
- 一位 Rust 开发者的 Go 初体验
作者 | Nick Cameron 责编 | 郭芮 过去几周,我一直在用 Go 语言编写程序.这是我首次在大型且重要的项目中使用 Go.在研究 Rust 的特性时,我也看了很多关于 Go 的内容,包括 ...
- 《Go语言圣经》笔记
文件组成 特点: Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令(译注:静态编译) Go语言原生支持Unicode,它可以处理全世界任何语言的文本 组成: 通过包(pac ...
- 2023版golang面试题100道(slice)
面试题合集目录 整型切片如何初始化? s1 := make([]int, 0) s2 := make([]int, 5, 10) s3 := []int{1, 2, 3} nil切片和空切片指向的地址 ...
- 面试笔记二(总结的答案可能有误,感谢批评指正)
持续更新中-- 好好住 golang实习生 一百多人小厂(1~9) 跟谁学一面(10~16) 好好住 golang实习生 一百多人小厂(1~9): 1.mysql主从复制怎么实现? 笔者把这个问题 ...
最新文章
- numpy.loadtxt画功率谱图
- add svn 多个文件_深圳信狮SVN技术文档
- 水晶报表Crystal 语法 实用字段编辑
- 【Python】Python 远程连接服务器,用它就够了
- CentOS 初体验十五:阿里云安装Nginx
- vue 返回上一页传参_H5页面与微信小程序相互跳转并传参(web-view)
- “记录”是给世界做积极贡献的一种方式
- PAT乙级-1070. 结绳(25)
- C# 结合 Golang 开发
- [ZJOI2012]数列
- 脚手架 mixin (混入)
- SpringBoot通过配置文件自动加载到map中
- webpack4.x中使用postcss-loader、autoprefixer给CSS属性自动添加前缀
- SQL Server中char与nchar区别
- Atitit 定时器timer 总结 目录 1.1. Js定时器 window.setInterval	1 2. Java定时器 timer	1 1.1.Js定时器 window.setInter
- 值得收藏的50个学习C语言的源代码网站
- 如何手动释放Python的内存
- linux下XMind创建运行图标
- mysql密码expired_mysql密码过期的修改方法(your password has expired)
- linux 查看java版本
热门文章
- 分布式数据库中间件概念
- Linux设备树语法详解【转】
- (XGBoost)提升树入门介绍(Inrtoduction to Boosted Trees)
- PHP CodeBase: 求最近一个周一和上周一的日期
- SpringMVC+Json构建基于Restful风格的应用
- [android] 请求码和结果码的作用
- 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~二 DBContext实例中,表实体对象是怎么被加入的...
- netbsd配置gnome桌面
- JQuery 中简单的几个 类选择器 使用方法
- PyQt4(简单界面)