13

それらは同じようです:

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 を使用して Si を初期化する明らかな方法がないことに気付きました。それを行う方法はありますか?new(S{i:1})動作していないようです:/

4

3 に答える 3

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. これが実装の詳細なのか仕様の一部なのかはわかりませんが、両方が同じプールから割り当てられていることを示しています。

ここでコードをいじってみましょう。

new による初期化に関しては、言語仕様によると: The 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応じて、型と任意のメンバー フィールドにとって意味のある のバージョンでそれを初期化します。

于 2014-08-13T23:35:43.117 に答える