专栏首页golang小白成长记连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。

连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。

问题

package main

import (
 "fmt"
 "reflect"
 "unsafe"
)

func main() {

 var s1 []int
 s2 := 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切片和空切片最大的区别在于指向的数组引用地址是不一样的
  • 所有的空切片指向的数组引用地址都是一样的

本文分享自微信公众号 - golang小白成长记(golangxbczj),作者:咏春警告的胖虎

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 给我十个可爱的订阅的粉丝带来的一篇iOS面经。。。。

    大大小小参加过不下30+公司的面试,其中不乏BAT、TMD等一线互联网公司,总结一下,发现大厂招聘都有一个共性。

    Kris大鲨
  • 分析33个均阅读 1000+ 大佬公众号 手把手教你写出爆款文章

    或许你也在用博客来记录自己的学习历程,与别人分享技术。可是有时候你会感觉为什么我的文章也是用心烹饪的,感觉自己文章跟大佬的文章相比质量并不差啊,可是从访问量、点...

    sowhat1412
  • Go 语言切片的三种特殊状态 —— 90% 的开发者都忽视了

    我们今天要来讲一个非常细节的小知识,这个知识被大多数 Go 语言的开发者无视了,它就是切片的三种特殊状态 —— 「零切片」、「空切片」和「nil 切片」。

    老钱
  • 金三银四面试回来,我想跟程序员们谈谈

    说来惭愧,也不怕你们笑话。做开发8年多,到目前还是一名不折不扣的扫地僧。年前的辞职,到现在还在家静养中。其实也没什么,就是回家总结一下自己这些年来在外工作与面试...

    烂猪皮
  • Go 语言简介(上)— 语法

    Hello World package main //声明本文件的package名 import "fmt" //import语言的fmt库——用于输出 f...

    李海彬
  • 知乎高赞:本科生如何才能进入 BAT 等一流互联网大厂?

    链接 | zhihu.com/question/26406260/answer/186461717

    一个优秀的废人
  • 太强了!Android开发4年网易三面后拿下offer定薪25k*14.5,涨薪50%

    本人很愚笨,坚持梦想才是最重要的,最后你会得到应有的回报。 之前面经中的大神说道“重要的事情说三遍,心态最重要,心态最重要,心态最重要”。

    Android技术干货分享
  • Linux大牛分享的7道经典面试题和秒收 offer 的技巧

    笔者其实没有想到去面试,只是在智联上更新了一下简历,就陆陆续续接到很多猎头的邮件和电话,闲话少说,下面就分享给大家Linuxer的面试经历:

    小小科
  • Golang学习-第二篇 搭建一个简单的Go Web服务器

    正文 Go语言标准库 - net/http 在学习Go语言有一个很好的起点,Go语言官方文档很详细,今天我们学习的Go Web服务器的搭建就需要用到Go语言官方...

    李海彬
  • Linux大牛分享7道面试题告诉你秒收 offer 的技巧

    笔者其实没有想到去面试,只是在智联上更新了一下简历,就陆陆续续接到很多猎头的邮件和电话,实在是没准备好要去面试,就推掉了几家公司的面试了。正因为笔者也很久没有面...

    小小科
  • 为什么不推荐使用PHPicker

    iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker...

    ios-lan
  • Go-常识补充-切片-map(类似字典)-字符串-指针-结构体

    fmt.Printf("%T", a) ,注意,用的是 fmt.Printf 函数,a 指的是要查看类型的变量

    suwanbin
  • 你不知道的 Go 之 slice

    切片(slice)是 Go 语言提供的一种数据结构,使用非常简单、便捷。但是由于实现层面的原因,切片也经常会产生让人疑惑的结果。掌握切片的底层结构和原理,可以避...

    用户7731323
  • Linux大牛分享的7道经典面试题和秒收 offer 的技巧

    转一篇文章,原文来自:总结一下:运维工程师面试的经历及面试相关问题(会持续更新)-DevOps(甘兵)-51CTO博客。面经很好,建议最近有求职需求的小伙伴仔细...

    马哥linux运维
  • Go 语言之父详述切片与其他编程语言数组的不同

    切片是Go 语言核心的数据结构,然而刚接触 Go 的程序员经常在切片的工作方式和行为表现上被绊倒。比如,明明说切片是引用类型但在函数内对其做的更改有时候却保留不...

    KevinYan
  • 环信SDK 头像、昵称、表情自定义和群聊设置的实现 一(附源码)

    前言: 环信的SDK在公司的项目中有用到,现在用到的是群聊的部分,这里我们分析总结一下自己对环信给的DEMO大概的拆解一下,说说我们怎么样充分的利用这个de...

    Mr.RisingSun
  • Go语言实战: 编写可维护Go语言代码建议

    大家好, 我在接下来的两个会议中的目标是向大家提供有关编写Go代码最佳实践的建议。

    李海彬
  • 实效go编程--2

    Go函数的返回值或结果“形参”可被命名,并作为常规变量使用,就像传入的形参一样。 命名后,一旦该函数开始执行,它们就会被初始化为与其类型相应的零值; 若该函数执...

    李海彬
  • 专科毕业五年,我进腾讯了!

    链接:https://zhuanlan.zhihu.com/p/265147335

    winty

扫码关注云+社区

领取腾讯云代金券