Go中的new(Struct)和& Struct {}有什么区别?

时间:2013-08-24 16:21:24

标签: go

他们似乎是一样的:

package main

import "fmt"

type S struct {
    i int
}

func main() {
  var s1 *S = new(S)
  fmt.Println(s1)

  var s2 *S = &S{}
  fmt.Println(s2)  // Prints the same thing.
}

更新

嗯。我刚刚意识到使用new初始化S.i没有明显的方法。有没有办法做到这一点? new(S{i:1})似乎不起作用:/

3 个答案:

答案 0 :(得分:9)

来自documentation

  

作为一个限制性案例,如果复合文字根本不包含任何字段,   它为该类型创建零值。表达式new(File)和   & File {}是等效的。

答案 1 :(得分:1)

它们不仅会给出相同的结果值,而且如果我们分配两种方式并查看它们的值......

// Adapted from http://tour.golang.org/#30
package main

import "fmt"

type Vertex struct {
    X, Y int
}

func main() {
    v := &Vertex{}
    v2 := new(Vertex)
    fmt.Printf("%p %p", v, v2)
}

...我们将看到它们实际上是分配在连续的内存插槽中。典型输出:0x10328100 0x10328108。我不确定这是实现细节还是规范的一部分,但它确实证明它们都是从同一个池中分配的。

Play around with the code here.

至于使用new初始化,根据the language specThe built-in function new takes a type T and returns a value of type *T. The memory [pointed to] is initialized as described in the section on initial values.因为go中的函数不能重载,并且这不是可变函数,所以没有传递任何初始化数据的方法。相反,go将使用适用于类型和任何成员字段的0版本来初始化它。

答案 2 :(得分:0)

Case 1: package main

import (
    "fmt"
)

type Drink struct {
    Name    string
    Flavour string
}

func main() {
    a := new(Drink)
    a.Name = "Maaza"
    a.Flavour = "Mango"
    b := a
    fmt.Println(&a)
    fmt.Println(&b)
    b.Name = "Frooti"

    fmt.Println(a.Name)

}//This will output Frooti for a.Name, even though the addresses for a and b are different.

Case 2:
package main

import (
    "fmt"
)

type Drink struct {
    Name    string
    Flavour string
}

func main() {
    a := Drink{
        Name:    "Maaza",
        Flavour: "Mango",
    }

    b := a
    fmt.Println(&a)
    fmt.Println(&b)
    b.Name = "Froti"

    fmt.Println(a.Name)

}//This will output Maaza for a.Name. To get Frooti in this case assign b:=&a.