首页
学习
活动
专区
圈层
工具
发布

面试官:值为 nil 为什么不等于 nil ?

可能很多同学,会认为结果是输出两个 nil。 为什么呢? 因为 f 和 a 都没初始化,都是 nil,所以循环遍历后肯定也是 nil。 如果你的答案也是这样,那就掉进坑里了。 答案是,啥都不会输出!...且听我慢慢给你分析: 一、变量的值和类型 我们先来打印下这两个值: var f func() var a *struct{} fmt.Println(f, a) // 输出结果 nil> nil>...我们这样打印其实是打印的是他的值,是 nil 没错的。...含有对类型的判断 当我们从 interface 里面把对象取出来后,使用 if 进行判断,他不单单的比较的是值,还有类型。...三、怎么判断值是否为 nil 我们在写代码时,最好是尽量避免这种代码,如果硬要这么写,那我们可以通过以下两种常见方式判 nil。

67820

Go 语言揭秘:接口类型是 nil 但不等于 nil?

具体地说,它展示了为什么在某些情况下,类型为 any 的变量即使其值为 nil,也不会被认为是 nil。在这段代码示例中,首先定义了一个 isNil 函数,其参数为 x any。...any(interface{}) 内部结构在 Go 语言中,any 是 interface{} 的别名。interface{} 接口值在底层由两部分构成:类型部分 和 值部分。...如果接口持有一个 *int 类型的值,那么类型部分就是 *int。值部分:接口持有的具体值。如果接口持有值是整数 3,那就是 3,如果是 nil,那就是 nil。...当我们将一个值赋给接口类型(如 any)时,接口会保存该值的 类型 和 具体值。只有当接口的 类型部分 和 值部分 都为 nil 时,该接口才被认为是 nil。...关键点总结如下:接口类型内部结构:any(即 interface{})底层由 类型部分 和 值部分 组成。只有当 类型部分 和 值部分 都为 nil 时,接口才被认为是 nil。

63710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    golang中接口值(interface)与nil比较或指针类型之间比较的注意问题

    注意问题 , 当对interface变量进行判断是否为nil时 , 只有当动态类型和动态值都是nil , 这个变量才是nil 下面这种情况不是nil func f(out io.Writer) {...= nil { out.Write([]byte("done!\n")) } } var buf *bytes.Buffer f(buf) ?...上面的情况 , 动态类型部分不是nil , 因此 out就不是nil 动态类型为指针的interface之间进行比较也要注意 当两个变量的动态类型一样 , 动态值存的是指针地址 , 这个地址如果不是一样的..., 那两个值也是不同的 w1 := errors.New("ERR") w2 := errors.New("ERR") fmt.Println(w1 == w2) // 输出false ?...由于 w1.value 和 w2.value 都是指针类型,它们又分别保存着不同的内存地址,所以他们的比较是得出 false 也正是这种实现,每个New函数的调用都分配了一个独特的和其他错误不相同的实例

    2.6K10

    = nil 了,学会这几个技巧,假装自己是Go大神

    = nil。它逻辑清晰,非常符合 Go 的设计哲学,这个没法反驳。但我发现仅仅会写 if err != nil 是远远不够的。这就像学车,拿到驾照只是第一步,上路还得重新学习。...= nil,心里想着:“这地方应该不会出错”。这好像能让代码看起来干净点。但,男人,你这是在玩火。在我看来,忽略错误是能犯下的最严重的错误。...filename, err)) } return data}✅ 正确的处理方式二:error 用于可预见的失败,panic 用于灾难性故障聪明的 Go 开发者都遵循一个原则:error 值用于处理那些可能发生...= nil { // 好的,这个配置对于应用启动是绝对必要的。...它的真正目的是构建出健壮、易于理解和维护的应用程序。通过超越基本的错误检查,并真正实践以下几点:明确处理每一个 error 返回值。清楚 error 和 panic 的使用边界。

    16610

    为何 987654321123456789 的值是 8.0000000729

    本文告诉大家,后面几个是如何算的 实际的值是 8.0000000729000006633900060368490549353263999114702391943791‌​76668850507686539619‌​94751054152234592785‌​33479434654662855357‌​43198375263105214894‌​25745553774284539345‌​98930804850270324137‌​45994965088554182305‌​84305898317183674686‌​37143964598010077841‌​89170836121454608705‌​23693921765614688067‌​09366141055231883602‌​61014078375228113214‌​57583025264005529902‌​45032211229793122191‌​11741193916844864643‌​28826825392324111070‌​14941073835963771907‌​27032435615995164105‌​55599336055953958109‌​18101879354727102128‌​01662936495132722105‌​70777116194071757366‌​05299203108222748284‌​82700939192578546652‌​46477453742944829060‌​79794445326129452467

    88040

    河北稳控科技通用型安全监测数据管理系统GMOD企业版

    GMOD通用型安全监测数据管理系统.png 关于GMOD GMOD(General Multiple monitoring program On Database server System)通用型多项目安全监测数据管理服务系统...(以下简称GMOD管理系统)是基于计算机、数据库、安全监测等技术的全自动监测数据管理、数据服务、监测预警软件系统,广泛应用于地质灾害、城市安全、水库大坝、水文地质、大气环境、工程建设、矿山开采等相关领域...GMOD的开发目的是打造通用、开放的具有安全监测普遍业务需求的通用型安全监测数据管理、数据服务平台,系统应用范围更广泛,数据接入、输出接口兼容性强,支持连接不同厂家、不同型号监测设备,可将不同厂家已有监测系统接入本系统...分层级数据共享机制,可实现复杂的多中心数据共享管理;可编程报表、自定义预警机制、自动化计划任务等功能模块,用户使用更加自由;脚本功能可在主程序相对独立稳定升级的基础上实现客户功能无限扩展;多参数预警功能可实现绝对值、...相对值、速率值的桌面、短信、网络预警。

    62720

    VGUI融合的3种实现方式

    一般来说,多模交互中的VGUI(VUI+GUI的简称)有三种实现方式,分别是应用级语音交互、可见即可说和系统级语音交互,真正对多模交互有用的实现方式是系统级语音交互,以下我会介绍三种实现方式的区别。...这是VGUI的第一个特点:多通道结合使用可以提升工作效率。 ?...第二个特点是:可见即可说可以在任意界面上使用。总结在一起就是VGUI的第四个特点:VUI可以随时随地操控当前界面上的元素。 可见即可说和应用级语音交互有着本质上的区别。...这是可见即可说的第二个特点和VGUI的第五个特点:VGUI依赖于连续对话的能力。...最后,系统级语音交互能兼顾GUI和VUI的优点,提升VGUI的工作效率,是真正的VGUI融合。

    1.6K40

    为何 987654321123456789 的值是 8.0000000729

    本文告诉大家,后面几个是如何算的 实际的值是 8.0000000729000006633900060368490549353263999114702391943791‌​76668850507686539619‌​94751054152234592785‌​33479434654662855357‌​43198375263105214894‌​25745553774284539345‌​98930804850270324137‌​45994965088554182305‌​84305898317183674686‌​37143964598010077841‌​89170836121454608705‌​23693921765614688067‌​09366141055231883602‌​61014078375228113214‌​57583025264005529902‌​45032211229793122191‌​11741193916844864643‌​28826825392324111070‌​14941073835963771907‌​27032435615995164105‌​55599336055953958109‌​18101879354727102128‌​01662936495132722105‌​70777116194071757366‌​05299203108222748284‌​82700939192578546652‌​46477453742944829060‌​79794445326129452467

    58320

    N1 | 什么是BLUP值?

    什么是BLUP值 ❝最近有朋友问我,说是对BLUP值这个概念不太理解,希望我能讲一下。新年新气象,我也梳理一下这个概念。...❞ 看一下wiki的概念 ❝最佳线性无偏预测(best linear unbiased prediction,简称BLUP),又音译为“布拉普”[1],是统计学上用于线性混合模型对随机效应进行预测的一种方法...——wiki ❞ BLUP的全称 BLUP :Best Linear Unbiased Prediction = 最佳线性无偏预测 最佳——估计误差最小,估计育种值与真实育种值的相关最大 线性——估计是基于线性模型...(估计值与观察值呈线性关系) 无偏——估计值的数学期望等于真值 预测——预测一个个体将来作为亲本的种用价值(随机遗传效应) 育种中如何理解BLUP 「BLUP」是一种统计方法,畜禽育种中适合应用这一方法预测个体育种值...BLUE值和BLUP值 「BLUE」值,相当于是对混合线性模型中固定因子的估算 「BLUP」值,相当于是对混合线性模型中随机因子的预测 BLUE值一般是矫正的表型值,尺度和表型值一致,如果是多个重复或者多年多点的数据

    2.9K10

    String是值传递还是引用传递

    String是值传递还是引用传递 今天上班时,同事发现了一个比较有意思的问题。他把一个String类型的参数传入方法,并在方法内改变了引用的值。...参数为基本类型时是值传递, 参数为封装类型时是引用传递。...上面的两个例子是明显的值传递和引用传递。但是如果参数是String类型呢?...虚拟机讲num’传入方法,方法将num’的值改为1. 方法结束,方法外打印num的值,由于num内存中的值没有改变,还是0,所以打印是0....我们看到的效果是封装类型的值是改变的。 最后我们再来解释String在传递过程中的步骤: 虚拟机在堆中开辟一块内存,并存值”ab”。 虚拟机在栈中分配给str一个内存,内存中存的是1中的地址。

    1.3K30

    测试视角-什么是分位值?

    1前情:研测周期 互联网项目版本快速迭代要求技术层面的研发测试环节更快更高效,如何缩短研测周期是测试人员经常思考的问题。...免测项目编号是 1-3,非免测项目编号4-10。如何评估该业务的研测周期,未来制定更高效的周期目标呢?...2被平均了吗 我们很习惯的用平均的方式来评估数据,每年首富的热搜上榜,被平均的梗就接踵而至,意味着财富的评估不可以用平均值的手段来衡量,因为贫富差距过大,结果计算包含极小值和极大值就无法整体衡量居民的收入水平...中位数,也叫50分位,在第一节里面,项目数是偶数,中位数是项目5和项目6的平均值,即中位数34h。我们在实际衡量研测周期需要考虑项目本身,排除噪点。...同理,性能测试里报告里面的平响和90T就是平均值VS分位值,在评估性能中,我们一般取90分位,即排除掉10%的噪点用以衡量响应时间。

    97920

    COST值相同?是真是假?

    这两天碰到一个问题,一条SQL的两个执行计划COST成本值相同,Oracle是怎么选择的?...经albert指点,dbsnake有篇文章《CBO对于Cost值相同的索引的选择》,介绍的场景,和这个很像, 这意味着对于Oracle 10gR2及其以上的版本,CBO对于Cost值相同的索引的选择实际上会这样...: 1、如果Cost值相同的索引的叶子块数量不同,则Oracle会选择叶子块数量较少的那个索引; 2、如果Cost值相同的索引的叶子块数量相同,则Oracle会选择索引名的字母顺序在前面的那个索引。...owner, object_name, created),只是这次索引名称是idx_t1_02,trace信息不展示了,两个索引的成本值和上面的相同,说明并不是在COST值相同,而且索引叶子快数量相同的情况下...有理由猜测,11g中两个执行计划对应的COST很可能在小数两位以内是相同的,例如一个是2.001,一个是2.002,因为trace只显示小数点右侧两位,所以看到的是2.00,都是相同的,其实不同, Index

    64620

    java是值传递还是引用传递

    1.概述 曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:“传参数就是值传递,传对象就是引用传递”,后面进一步查找了相关资料和文章以后,发现这么理解是不正确的...这里先放结论: java中参数的传递可以理解为都是值传递 基础数据类型传递的是值的拷贝 对象类型是共享对象传递,传递的是地址的拷贝 2.形参和实参 要理解参数的传递就必须先理解形参和实参: 形参:就是形式参数...值传递:方法调用时,实际参数的值被传递给对应的形式参数,函数接收的是原始值的一个copy, 此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值...引用传递/址传递:方法调用时,实际参数的地址被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址。...因为参数的地址都指向同一个对象,所以我们称也之为"传共享对象",所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的。

    41910
    领券