为什么要在go中分配对结构的引用?

时间:2013-02-02 16:11:11

标签: reference struct initialization go

我正在查看此页面的代码:

http://golang.org/pkg/net/http/

有一件事我不明白 - 在某些时候,新的结构被创建并初始化为:

client := &http.Client{
    CheckRedirect: redirectPolicyFunc,
}

为什么在创建此结构时使用&

我也读过这个blog post,结构体初始化如下:

r := Rectangle{}

两者之间有什么区别?如何知道使用哪一个?

3 个答案:

答案 0 :(得分:6)

区别在于变量的类型。

client := &http.Client{

使client

类型为*http.Client

,而

client := http.Client{

构建http.Client

答案 1 :(得分:3)

最上面一个是返回一个指针。这是一个Go成语而不是使用new。第二个只是一个价值对象。如果你需要一个指针使用顶部。

查看有效的go doc以获取更多相关信息

http://golang.org/doc/effective_go.html#allocation_new

答案 2 :(得分:2)

在面向对象的编程中,为了使对象具有动态生命周期(即不依赖于当前函数调用),需要在当前堆栈帧以外的地方动态分配,因此您可以操作对象通过指针。这是一种常见的模式,在许多面向对象的语言中,包括Java,Python,Ruby,Objective-C,Smalltalk,JavaScript等,你只能处理指向对象的指针,从不使用“对象作为值”本身。 (有些语言,比如C ++,确实允许你将“对象作为值”;它带有RAII习语,增加了一些复杂性。)

Go不是面向对象的语言,但它能够定义自定义类型并定义对该自定义类型进行操作的方法,可以使其非常类似于类和方法。从“构造函数”函数返回指向该类型的指针允许“对象”具有动态生存期。