与“golang指针”相关的TAG标签
Go中指针变量var声明时默认值为nil,是明确零值;解引用前须判空;初始化常用&取地址、new()分配零值内存、或&Struct{…}复合字面量。
Go中直接解引用nil指针会panic,因语言不提供隐式空值防护,必须显式检查p!=nil;常见陷阱包括嵌套指针未逐级判断、误用*p!=0等,应结合govet和staticcheck提前发现风险。
new返回指针,make返回引用类型本身;new(T)分配零值内存并返回*T,仅适用于任意类型;make仅适用于slice、map、chan,返回已初始化的实例。
Go函数返回局部变量指针不会崩溃,因为编译器通过逃逸分析将可能被外部引用的局部变量自动分配到堆上,确保指针有效;但会带来堆分配和GC开销。
必须用解引用才能修改原变量值,指针本身只是地址,不加操作的是指针变量自身;传指针进函数需用*p修改目标值,nil指针解引用会panic,须判空;结构体嵌套指针字段需逐层检查并初始化;new(T)仅得零值指针,&T{}支持字段初始化;返回局部变量地址安全,因逃逸分析自动移至堆。
slice是含ptr/len/cap的值类型结构体,传参拷贝header导致append扩容不影响调用方;要更新原slice必须传*[]T并解引用赋值。
Go语言所有函数参数都是值传递,包括指针:传的是地址值的副本,而非引用;slice/map/channel是含指针的值类型,故能修改底层数组但扩容不影响原变量。
必须用Elem()解引用指针才能读写底层值,因为reflect.ValueOf(&x)返回的是不可设值的指针类型Value,只有调用Elem()获取其指向的可寻址值后,CanSet()才为true,否则SetInt()等操作会panic。
结构体24字节优先值传递,含大数组/需修改字段/并发安全等场景用指针;须用unsafe.Sizeof测真实大小、-benchmem对比基准、-gcflags="-m-m"查逃逸,避免误判。
Go语言禁止普通指针算术运算是出于安全考虑:防止内存越界、确保GC可追踪、维持零成本抽象;真需偏移必须经unsafe.Pointer中转uintptr,且不可长期持有。
