Go中nil的使用

一句话定义

nil 是 Go 里"没有值 / 空引用 / 未指向任何对象"的零值

------ 类似于 null,但规则更严格。


一、nil 到底能用在哪些类型上?

⚠️ 不是所有类型都能是 nil

✅ 可以是 nil 的类型(引用类型)

类型 说明
pointer 指针
slice 切片
map 映射
channel 通道
func 函数
interface 接口
go 复制代码
var p *int = nil
var s []int = nil
var m map[string]int = nil
var ch chan int = nil
var f func() = nil
var i interface{} = nil

❌ 不能是 nil 的类型(值类型)

go 复制代码
var a int = nil      // ❌ 编译错误
var b string = nil   // ❌
var c struct{} = nil // ❌
var d bool = nil     // ❌

这些类型有明确的零值 (0、""、false),不需要 nil


二、nil ≠ "空",这是 Go 里最容易踩的坑

1️⃣ nil slice vs 空 slice

go 复制代码
var s1 []int        // nil
s2 := []int{}       // 空 slice

区别:

s1 s2
值 nil 非 nil
len 0 0
可 append ✅ ✅
s == nil true false
go 复制代码
fmt.Println(s1 == nil) // true
fmt.Println(s2 == nil) // false

👉 len 为 0 ≠ nil


2️⃣ nil map 不能写

go 复制代码
var m map[string]int
m["a"] = 1 // ❌ panic

必须先初始化:

go 复制代码
m := make(map[string]int)
m["a"] = 1 // ✅

3️⃣ nil pointer 不能解引用

go 复制代码
var p *int
fmt.Println(*p) // ❌ panic

三、nil 在函数返回值里的经典用法

这是你现在写 Web / 文件系统一定会遇到的:

go 复制代码
func readFile() ([]byte, error) {
    if err != nil {
        return nil, err
    }
    return data, nil
}

含义非常清晰:

  • 成功:有 data,error 为 nil
  • 失败:data 为 nil,error 不为 nil

👉 Go 的错误处理模式全靠 nil


四、最容易把人坑死的一种 nil(接口 nil)

这是 Go 面试/实战必考点。

看起来是 nil,其实不是

go 复制代码
var p *int = nil
var i interface{} = p

fmt.Println(i == nil) // false ❗

原因:

interface =(动态类型 + 动态值)

只要"类型"不为 nil,interface 就不为 nil


正确判断方式

go 复制代码
if i == nil {
    // 真正的 nil
}

但如果你是从 interface 拿值:

go 复制代码
if v, ok := i.(*int); ok && v == nil {
    // v 是 nil 指针
}

相关推荐
张彦峰ZYF2 分钟前
升级了不等于变好了:AI回归测试的固定评测集、版本对比、质量阈值与CI门禁
人工智能·后端·模型或提示词升级·语言模型没有编译器与确定性输出·总体、切片与回退清单·红线、护栏与目标·ci门禁把判定写进合并路径
青梅味猪大肠3 分钟前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
程序员沉梦听雨7 分钟前
【搜索引擎】Kibana使用指南
java·后端·学习笔记
Cosolar34 分钟前
极简智库(MiniDocs):docsify、VitePress、Notion 等知识库搭建服务的完美替代
前端·后端·架构
Goboy1 小时前
夯爆了,我被一个一句话接入的免费可观测平台策反了,那一刻我决定放弃用了3年的Prometheus
后端·docker·kubernetes
starzy19901 小时前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala
回家路上绕了弯1 小时前
Agent in the Sandbox:当 AI 有了自己的开发环境
后端
陈随易2 小时前
TanStarter,从搭建到支付,一步到位开始赚美元
前端·后端·程序员
Rain的Java大神之路2 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
挖掘狂人2 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
后端·sql·mysql