什么';新结构和&;之间的区别是什么;Go中的结构{}?

什么';新结构和&;之间的区别是什么;Go中的结构{}?,go,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})似乎不起作用://来自

它们似乎是一样的:

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})
似乎不起作用://

来自:

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


它们不仅给出了相同的结果值,而且如果我们从两个方面分配某些东西并查看它们的值

// 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
。我不确定这是实现细节还是规范的一部分,但它确实表明它们都是从同一个池中分配的


至于使用new初始化,根据:
内置函数new采用类型T并返回类型为*T的值。内存[指向]按照初始值一节中的描述进行初始化。
因为go中的函数不能重载,这不是一个可变函数,无法传入任何初始化数据。相反,go将使用对类型和任何成员字段有意义的任何版本的
0
对其进行初始化(视情况而定)。

有没有办法使用new初始化字段?@allyourcode不这么认为。文档是否说明了他们为什么选择包含
new
功能?我认为
go
是关于非重叠功能的。@ThomasAhle
x:=5
var x=5
var x int=5
var x int;x=5
?它不缺少重叠和冗余的方法来做同样的事情,尽管在许多情况下可以提供一组丰富的习惯用法来尽可能准确地表达程序员的意图。
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.