2013-08-24 37 views
7

Họ dường như là giống nhau:Sự khác nhau giữa cấu trúc mới (Struct) và & Struct {} trong Go là gì?

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

Cập nhật:

Hm. Tôi chỉ nhận ra rằng không có cách rõ ràng để khởi tạo S.i bằng cách sử dụng mới. Có cách nào làm được việc này không? new(S{i:1}) dường như không làm việc:/

Trả lời

7

Từ documentation:

Là một trường hợp giới hạn, nếu một chữ tổng hợp không chứa các lĩnh vực ở tất cả, nó tạo ra một giá trị zero cho các loại. Các biểu thức mới (Tệp) và & Tệp {} là tương đương.

+0

Có cách nào để khởi tạo các trường bằng cách sử dụng mới không? – allyourcode

+0

@allyourcode không nghĩ vậy. http://stackoverflow.com/questions/4498998/how-to-initialize-members-in-go-struct – Woot4Moo

+0

Tài liệu có nói sau đó, tại sao họ đã chọn để bao gồm chức năng 'mới'? Tôi nghĩ rằng 'go' là tất cả về chức năng không chồng chéo .. –

0

Không chỉ làm họ đưa ra giá trị kết quả giống nhau, nhưng nếu chúng ta phân bổ một cái gì đó cả hai cách và nhìn vào giá trị của họ ...

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

... chúng ta sẽ thấy rằng họ đang có trong thực tế được cấp phát trong các khe bộ nhớ liên tiếp. Sản lượng điển hình: 0x10328100 0x10328108. Tôi không chắc liệu đây có phải là một chi tiết thực hiện hay một phần của đặc điểm kỹ thuật, nhưng nó chứng minh rằng cả hai đều được phân bổ từ cùng một nhóm.

Play around with the code here.

Đối với khởi tạo với mới, theo 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. Bởi vì chức năng trong đi không thể bị quá tải, và đây không phải là một chức năng variadic, không có cách nào để vượt qua trong bất kỳ dữ liệu khởi tạo. Thay vào đó, đi sẽ khởi tạo nó với bất kỳ phiên bản nào của 0 có ý nghĩa đối với loại và bất kỳ trường thành viên nào, nếu thích hợp.

Các vấn đề liên quan