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

相关推荐
huangdong_5 小时前
淘宝商品SKU图自动分类技术深度解析:从DOM解析到智能归档
开发语言·javascript·ecmascript
阿正的梦工坊5 小时前
【Rust】12-借用检查器与非词法生命周期
开发语言·后端·rust
qq_2518364575 小时前
基于java Web网络订餐系统设计与实现 源码文档
java·开发语言·前端
秋96 小时前
3年经验Python后端转AI Engineer:3个月实战转型计划(2026版)
开发语言·人工智能·python
凡人叶枫6 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
飞天狗1116 小时前
零基础JavaWeb入门——第2课:让网页“活”起来 —— JSP是什么?
java·开发语言·前端·后端·web
梦@_@境6 小时前
面向 Spring Boot 的可观测业务流程编排引擎
java·spring boot·后端
醇氧7 小时前
【Linux】Java 服务生产级部署指南:实现常驻后台、开机自启与系统服务化管理
java·开发语言
凡人叶枫7 小时前
Effective C++ 条款16:成对使用 new 和 delete 时要采取相同形式
开发语言·c++·effective c++
JAVA面经实录9177 小时前
Netty 全套系统化学习文档(零基础到高阶面试完整版)
java·后端