2017-02-02 14 views
7

Có bất kỳ hàm ý nào (GC churn, hiệu suất hay cách khác) để xác định một hàm struct bên trong một hàm so với việc nó được xác định bên ngoài không? Ví dụ:Ý nghĩa của việc xác định một cấu trúc bên trong một hàm so với bên ngoài?

type Outside struct { 
    Foo string `json:"foo"` 
} 

func SomeFunc(b []byte) error { 
    outside := Outside{} 

    if err := json.NewDecoder(b).Decode(&outside); err != nil { 
    return err 
    } 

    ... 
} 

vs

func SomeFunc(b []byte) error { 

    type inside struct { 
    Foo string `json:"foo"` 
    } 

    if err := json.NewDecoder(b).Decode(&inside); err != nil { 
    return err 
    } 

    ... 
} 

Nên có bất kỳ tình huống mà một được ưa thích hơn người kia?

Trả lời

1

Sự hiểu biết của tôi là sự khác biệt chỉ ở khả năng truy cập. Một cấu trúc được định nghĩa bắt đầu bằng một chữ cái viết hoa sẽ được xuất khẩu, có nghĩa là nó có thể được truy cập từ các gói khác. Một cấu trúc được định nghĩa bắt đầu bằng một chữ thường có thể được truy cập từ bất cứ thứ gì trong cùng một gói nhưng không phải từ bên ngoài. Một cấu trúc được định nghĩa trong một hàm trong dòng chỉ có thể được truy cập/khởi tạo bởi hàm đó.

0

Có mối quan tâm rõ ràng về phạm vi khi khai báo bất cứ điều gì trong một cơ quan chức năng trái ngược với bên ngoài của nó.

Nhưng cũng trong ví dụ đầu tiên của bạn, bạn khai báo một loại bên ngoài nội dung hàm được biểu thị bằng biểu tượng Bên ngoài.

Trong ví dụ thứ hai của bạn, bạn khai báo một biến được ký hiệu bằng biểu tượng bên trong. Điều này có một loại chữ của cấu trúc bạn đã mô tả.

Lưu ý rằng trong ví dụ đầu tiên bạn có thể sử dụng ký hiệu Bên ngoài để tham chiếu đến bất kỳ biến nào thuộc loại Bên ngoài.

Trong ví dụ thứ hai của bạn, không có biểu tượng để chỉ loại biến được gọi là bên trong. Điều này là do loại biến này được biểu thị bằng cách sử dụng một cấu trúc ẩn danh.

2

Không có sự khác biệt về hiệu suất - đó chỉ là sự khác biệt về phạm vi (nghĩa là có thể xem định nghĩa loại). Nếu bạn chỉ cần loại trong một chức năng duy nhất, nó là tốt để xác định nó ở đó. Như những người khác đã lưu ý, nếu bạn xác định loại ở cấp gói (tức là, bên ngoài một hàm) với tên bắt đầu bằng chữ in hoa, nó sẽ được xuất (tức là, có thể nhìn thấy bên ngoài gói). Nếu tên không bắt đầu bằng chữ cái viết hoa, nó sẽ chỉ hiển thị trong gói.

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