我是Go的新手,在编写struct"functions"时我真的无法决定何时使用指针与副本(这是正确的术语吗?)
type Blah struct {
c complex128
s string
f float64
}
func (b * Blah) doPtr() {
fmt.Println(b.c, b.s, b.f);
}
func (b Blah) doCopy() {
fmt.Println(b.c, b.s, b.f);
}
Run Code Online (Sandbox Code Playgroud)
现在,我的C++背景告诉我doPtr
在速度和内存方面都更有效率,但是doCopy
除非你修改对象,否则很多例子都会使用,所以我错过了什么?
对于诸如基本类型,切片和小结构之类的类型,值接收器非常便宜,因此除非方法的语义需要指针,否则值接收器是高效且清晰的.
对于性能问题,请不要猜测.运行基准.例如,
文件: bench_test.go
package main
import (
"testing"
)
type Blah struct {
c complex128
s string
f float64
}
func (b *Blah) doPtr() {
}
func (b Blah) doCopy() {
}
func BenchmarkDoPtr(b *testing.B) {
blah := Blah{}
for i := 0; i < b.N; i++ {
(&blah).doPtr()
}
}
func BenchmarkDoCopy(b *testing.B) {
blah := Blah{}
for i := 0; i < b.N; i++ {
blah.doCopy()
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ go test -bench=.
testing: warning: no tests to run
PASS
BenchmarkDoPtr 2000000000 1.26 ns/op
BenchmarkDoCopy 50000000 32.6 ns/op
ok so/test 4.317s
$
Run Code Online (Sandbox Code Playgroud)