2013-08-24 21 views
7

Onlar aynı görünüyor:Go'da yeni (Struct) ve & Struct {} arasındaki fark nedir?

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. 
} 

Güncelleme:

Hm. S.i'yi yeni kullanarak başlatmak için açık bir yol olmadığını anladım. Bunu yapmanın bir yolu var mı? new(S{i:1}) çalışmak görünmüyor:/

cevap

7

documentation Gönderen:

sınırlayıcı bir durum olarak, bir kompozit değişmezi hiç alanları içeriyorsa, o türü için sıfır değerini oluşturur. Yeni (Dosya) ve & Dosya {} ifadeleri eşdeğerdir.

+0

Yeni alanlar kullanarak alanları başlatmanın bir yolu var mı? – allyourcode

+0

@allyourcode bunu düşünmeyin. http://stackoverflow.com/questions/4498998/how-to-initialize-members-in-go-struct – Woot4Moo

+0

Belgeler o zaman, neden 'yeni' işlevini dahil etmeyi seçtiklerini söylüyor mu? Ben her şey örtüşen işlevsellik ile ilgili olduğunu düşündüm .. –

0

Sadece aynı çıkan değer vermek, ama biz ...

// 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) 
} 

bir şey her iki yönde tahsis ve değerleri bakarsak ... biz onlar aslında olduğunu görürsünüz ardışık bellek yuvalarına ayrılmıştır. Tipik çıktı: 0x10328100 0x10328108. Bunun bir uygulama detayı veya belirtimin bir parçası olup olmadığından emin değilim, ancak her ikisinin de aynı havuzdan ayrıldığını gösteriyor.

Play around with the code here.

the language spec göre, yeni ile başlatılıyor gelince

: seferde fonksiyonları aşırı olamaz çünkü 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. ve bu variadic işlev değil, herhangi bir başlatma verilerindeki geçmesine imkan yok. Bunun yerine, gidip, 0'un hangi türüyle uygunsa, herhangi bir üye alanı ve türü için anlam ifade eder.

İlgili konular