能,但只在结构体较大时才有明显效果;小结构体用值接收者反而更高效。指针接收者仅复制8字节指针,避免大结构体拷贝开销,且支持修改原字段;而值接收者对小结构体更缓存友好、无nil风险、语义清晰。
能,但只在结构体较大时才有明显效果;小结构体用值接收者反而更高效。
Go 方法的接收者如果是值类型(如 func (s MyStruct) Method()),每次调用都会将整个结构体复制一份;而指针接收者(func (s *MyStruct) Method())只复制一个指针(通常 8 字节),不复制底层数据。
参——只是固定 8 字节,与结构体大小无关不是“只要结构体有字段就用指针”,关键看两点:是否需要修改 receiver,以及结构体是否“重”。
比如 type Point struct{ X, Y int }(16 字节),现代 CPU 缓存友好,值传递可能比间接寻址(指针解引用)更快。
运行 go tool compile -S your_file.go,查看汇编中是否有大块 MOVQ/MOVOU(批量移动内存),如果有,说明值接收者在拷贝大结构体——这时换指针就有优化价值。
基本上就这些。不复杂但容易忽略:优化前先确认结构体真实大小(unsafe.Sizeof(T{})),别凭感觉猜。