我是个新手,在编写结构“函数”时,我真的无法决定何时使用指针,而不是使用副本(这是恰当的术语吗?)
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
,除非您正在修改对象,所以我是不是遗漏了什么?
发布于 2014-03-27 04:29:58
[Go] Frequently Asked Questions (FAQ) Should I define methods on values or pointers? 对于基本类型、切片和小结构,值接收方非常便宜,因此除非方法的语义需要指针,否则值接收方是高效和清晰的。
对于性能问题,不要猜测。运行基准。例如,
文件: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
$
发布于 2014-03-27 22:20:00
来自Go Programming Language Phrasebook, Chapter4 - by David Chisnall (国际海事组织,一本优秀的书。)
...The的另一个原因是,它意味着此方法不需要接受指向结构的指针。这是相当重要的,因为它与Go类型系统的关系。如果通过接口调用方法,则只有当接口变量包含指针时,才能调用接受指针的方法。。
例如,可以定义定义Log()方法的接口,并创建这种类型的变量。然后,可以将Logger结构的一个实例分配给该变量。还可以为此变量指定一个指向Logger结构实例的指针。这两种方法都可以工作,因为Log()方法可以从结构的实例和指向实例的指针中调用。如果该方法采用指针参数,则只能在指针上调用它。因此,Go的好样式是只需要方法在修改结构时接受指针,或者如果结构太大,以至于在每个方法调用上复制它都是禁止的.
https://stackoverflow.com/questions/22685062
复制相似问题