电话
400 9058 355
传指针不自动省内存,小类型(如int、string)传指针可能更费内存;仅当传递大结构体、大数组或需修改原值时,传指针才大概率减少拷贝。
Go 中传递指针并不自动节省内存,是否省内存取决于你传的是什么类型、有多大、以及是否真的避免了复制。
小基础类型(如 int、bool、string)传指针通常不省内存,还可能更糟:
int 在 64 位系统上占 8 字节,而 *int 也是 8 字节指针 —— 大小没变,但多了间接寻址开销string 本身是 16 字节结构体(2 个 uint64:指向底层数组的指针 + len),传 *string 是 8 字节指针,但你要先在堆或栈上分配一个 string 的副本再取地址,实际可能多一次分配&x)反而强制变量逃逸到堆,增加 GC 压力只在以下情况传指针才大概率

const 语义,但 Go 没 const 参数,只能靠约定)[1024]byte)或嵌套大结构体,值传递会完整复制整个内存块例如:
type BigStruct struct {
Data [2048]int64
Meta map[string]string
}
func process(bs *BigStruct) { /* ... */ } // 传指针:仅 8 字节
func processCopy(bs BigStruct) { /* ... */ } // 值传:至少 2048×8 = 16KB 拷贝Go 的函数参数永远是值传递,*T 传递的是指针值本身 —— 它仍是拷贝,只是拷贝的是地址。关键不是“用了指针”,而是“是否避免了大块数据复制”:
go build -gcflags="-m")比直觉更可靠:如果 T 值传不逃逸,它就在栈上,很快;若传 *T 导致原变量逃逸,整体反而更慢io.Reader)本身已是指针级抽象,再传 *os.File 没意义,os.File 本身就是引用类型(含文件描述符和互斥锁)go test -bench,关注 allocs/op 和 B/op,不能只看时间最常被忽略的一点:是否需要修改原值,比“省不省内存”优先级更高。先想清楚语义,再决定传值还是传指针。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...