2013-08-24 3 views
7

그들은 같은 것 같다 :Go (Struct)와 Struct (Struct)의 차이점은 무엇입니까?

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

업데이트 :

흠을. 방금 새를 사용하여 S.i를 초기화하는 분명한 방법이 없다는 것을 깨달았습니다. 그렇게 할 수있는 방법이 있습니까? new(S{i:1}) 작동하지 않는 것 :/

답변

7

documentation에서 :

을 제한하는 경우로, 복합 문자가 전혀 필드를 포함하지 않는 경우, 이 유형에 0 값을 생성합니다. new (File) 및 & File {}의 표현식은 동일합니다.

+0

새 필드를 사용하여 필드를 초기화하는 방법이 있습니까? – allyourcode

+0

@allyourcode는 그렇게 생각하지 않습니다. http://stackoverflow.com/questions/4498998/how-to-initialize-members-in-go-struct – Woot4Moo

+0

문서에 'new' 함수를 포함시킨 이유는 무엇입니까? 'go'는 중복되지 않는 기능에 관한 것이 전부라고 생각했습니다. –

0

뿐만 아니라 그들이 동일한 결과 값을 제공 할 수 있지만, 우리가 ...

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

the language spec에 따라, 새와 초기화에 대해서는

: 이동 함수는 오버로드 할 수 없기 때문에 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는 유형 및 모든 구성원 필드에 대해 적절하다고 판단되는 버전으로 0을 초기화합니다.

관련 문제