我是 Go 的新手,在编写结构“函数”时,我真的无法决定何时使用指针还是副本(这是正确的术语吗?)

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);
}

现在,我的 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()
    }
}

输出:
$ 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
$

关于performance - 在 struct "functions"中使用指针与复制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22685062/

10-13 08:45