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 指针
}

相关推荐
IT_陈寒1 小时前
React的状态更新坑得我差点加班到天亮
前端·人工智能·后端
天下无敌笨笨熊2 小时前
C#Modbus串口开发心得
开发语言·c#
电商API_180079052472 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11112 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
如意猴2 小时前
【C++】001--C++入门(1)
开发语言·c++
传奇开心果编程2 小时前
【Rust入门知识点学与练】第10课:Option 和 Result(错误处理入门)
开发语言·学习·rust
码事漫谈2 小时前
一天搭出 80% 的 Agent,然后卡在 95% 到死
后端
leonkay2 小时前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发
江湖十年2 小时前
在 Go 中使用 dyno 包处理动态对象
后端·面试·go
坐吃山猪2 小时前
【多线程】CompletableFuture使用
java·开发语言·多线程