go中指针类型与基类型完全独立,无隐式转换;必须用指针的场景包括修改原值、避免大对象拷贝、满足仅由指针接收者实现的接口;interface{}装nil指针不为nil,需类型断言后判空;new(t)与&v均得*t,但语义不同。

指针类型和基类型在Go里是完全不同的类型
Go的类型系统极其严格:*int 和 int 之间没有隐式转换,也不能互相赋值。这不是语法限制,而是类型系统设计使然——它们在编译期就被视为两个独立类型。
- 函数参数要求
*int,你传int会直接报错:cannot use i (type int) as type *int in argument to foo - 结构体字段声明为
Name *string,你就不能用"hello"字面量直接赋值,必须写&"hello" - 接口实现时,
T和*T的方法集不同:只有*T能调用带指针接收者的方法,这点常被忽略
什么时候必须用指针类型而不是基类型
不是“想用就用”,而是有明确动因:要么要修改原值,要么避免拷贝开销,要么满足接口契约。
- 需要在函数内修改原始变量值 → 必须传
*T,比如func swap(a, b *int) - 结构体较大(比如含切片、map 或嵌套字段)→ 传
*MyStruct避免复制整个内存块 - 某个接口方法只由
*T实现(例如Write(p []byte) (n int, err error)常以指针接收者定义)→ 你只能用*T赋值给该接口,T会静默不满足
interface{} 接收指针时的 nil 判断陷阱
interface{} 本身不是指针,但它可以装一个 *T 值;而这个 *T 是 nil,不代表 interface{} 是 nil —— 这是最容易翻车的地方。
2018年国内领先最专业的试客系统基于微软ASP.NET(C# NET4.0)+MSSQL架构开发,性能与安全性先天就比PHP语言好很多,系统主要活动类型:免费试用、折扣试用、红包试用、拍A发B等众多模式(支持淘宝、天猫、阿里、京东、拼多多、蘑姑街等,支持定制满足你的一切需求),另附带收藏/流量优化,推广联盟(可支持N级提成)、安全认证体系、微信公众号集成、交流论坛、帮助中心、招商等子模块,系统默
-
var p *int; var i interface{} = p→ 此时i != nil,因为i包含动态类型*int和动态值nil - 错误写法:
if i == nil { ... }永远不会进分支;正确做法是先类型断言再判空:if p, ok := i.(*int); ok && p == nil { ... } - 若你期望“空指针赋给 interface 后能直接判 nil”,说明你混淆了“值为 nil 的指针”和“未初始化的 interface”
new() 和取地址 & 的区别直接影响类型关系
new(T) 返回的是 *T,而 &v(其中 v 是 T 类型变量)返回的也是 *T,但二者生命周期和语义不同。
立即学习“go语言免费学习笔记(深入)”;
-
new(int)在堆上分配零值内存,返回指向它的*int;&localVar取的是栈上变量地址,若该变量逃逸,编译器会自动把它挪到堆上 - 对局部变量取地址(
&x)是安全的,Go 编译器会做逃逸分析;但手动用new()并不比&T{}更“高级”,后者更直观且支持字段初始化 - 别写
var p *int = new(int); *p = 42,直接写p := &42或p := new(int); *p = 42即可,重点在于理解它产出的是什么类型,而不是怎么写
* 和 &,其实是在帮你挡住一堆运行时才暴露的模糊逻辑。









