经过9年的C++开发,我正在探索Go.在C++中,由于性能损失,除了内置类型的变量之外,通过值传递函数的参数是一种不好的做法:参数的所有字段都将被复制,并且在大多数情况下,这将是一个非常昂贵的操作.
对Go来说这是真的吗?通过值传递"this"仅仅为方法分配"const"语义看起来非常昂贵.Go编译器是否足够智能以防止在第一次修改之前复制变量?为什么不通过值将"this"传递给Go中的反模式,就像在C/C++中一样?
看看下面显示的Go文档,我无法理解接收器和参数之间的区别:
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
Run Code Online (Sandbox Code Playgroud)
此方法的签名读取:这是一个名为save的方法,它将接收器p作为指向Page的指针.它不带参数,并返回类型错误的值.
我读了一些奇怪的代码,它们将一个方法转换为一个函数,该函数的第一个参数是指向该方法结构的指针.
我写了一个例子来演示它:
package main
import "fmt"
type fooS struct{}
func (s *fooS) fooF(fooArg interface{}) {
fmt.Println("fooF: ", fooArg)
}
type wowS struct {
callback func(s *fooS, fooArg interface{})
}
func main() {
wow := new(wowS)
wow.callback = (*fooS).fooF // strange
wow.callback(nil, 123)
}
Run Code Online (Sandbox Code Playgroud)
该示例的语法很奇怪,但没有错误.
谁能告诉我这些代码是如何工作的还是给我一份关于它们的官方文件?
谢谢:)