在struct"functions"中使用指针vs copy

One*_*One 3 performance go

我是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除非你修改对象,否则很多例子都会使用,所以我错过了什么?

pet*_*rSO 8

[Go]常见问题(FAQ)

我应该在值或指针上定义方法吗?

对于诸如基本类型,切片和小结构之类的类型,值接收器非常便宜,因此除非方法的语义需要指针,否则值接收器是高效且清晰的.

对于性能问题,请不要猜测.运行基准.例如,

文件: 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)

  • @OneOfOne:在Go中,所有参数(包括方法接收器)都通过堆栈上的值(赋值给参数)传递.我没有看到内存使用问题. (2认同)