2013-05-31 69 views
6

tôi rất tò mò về thứ tự trong đó một số loại khác nhau của biểu thức, vì vậy tôi cố gắng mã này trong mức phải khai báo hàng đầu, suy nghĩ nó sẽ thất bại, nhưng phát hiện ra rằng nó hoạt động:Trình tự đánh giá các biểu thức

http://play.golang.org/p/CfP3DEC5LP

var x = func() *Foo { 
    fmt.Println(f) // prints &{foobar} 
    return f 
}() 

var f = &Foo{"foobar"} 

type Foo struct { 
    bar string 
} 

Xin lưu ý:

  • tờ khai type Foo struct là ở dưới cùng

  • trước khi khai type có một var f khai và &Foo{] phân

  • trước khi khai var, có một chức năng đó là gọi ngay lập tức, mà tài liệu tham khảo và trả về biến f.

Trong khi nó không làm tôi ngạc nhiên quá nhiều đến nỗi tôi có thể làm cho một giá trị &Foo{} mặc dù nó diễn ra trước khi khai báo type Foo struct, nó đã làm tôi ngạc nhiên rằng tôi có thể tham khảo thành công và in giá trị f trước khi phân công của nó .

Đây có phải là hành vi đáng tin cậy và được chỉ định không? Tôi không thể tìm thấy bất kỳ tham chiếu đến một thứ tự như vậy trong các đặc điểm kỹ thuật, nhưng có lẽ tôi bỏ qua nó.

Trả lời

10

Xem the Go programming language reference

Trong vòng một gói, biến gói cấp được khởi động, và giá trị không đổi được xác định, theo thứ tự của tài liệu tham khảo: nếu initializer của A phụ thuộc vào B, A sẽ được thiết lập sau khi B. Phụ thuộc phân tích không phụ thuộc vào giá trị thực tế của các mục đang được khởi tạo , chỉ trên diện mạo của chúng trong nguồn. A phụ thuộc vào B nếu giá trị của A chứa đề cập đến B, chứa giá trị có trình khởi tạo đề cập B hoặc đề cập đến một hàm đề cập đến B, đệ quy. Đó là một lỗi nếu phụ thuộc như vậy tạo thành một chu kỳ. Nếu hai mục không phụ thuộc lẫn nhau, chúng sẽ được khởi tạo theo thứ tự chúng xuất hiện trong nguồn, có thể trong nhiều tệp, như được trình bày cho trình biên dịch. Kể từ khi phân tích sự phụ thuộc được thực hiện cho mỗi gói, nó có thể tạo ra kết quả không xác định nếu A của initializer gọi một hàm định nghĩa trong một gói phần mềm đó đề cập đến B.

+0

Cảm ơn, tôi đã đọc, nhưng tôi tin rằng nó đang nói về gói phụ thuộc. Câu hỏi đặt ra là về thứ tự đánh giá mã trong cùng một gói. Trừ khi đó là ý nghĩa của * "... theo thứ tự tham chiếu ..." *? –

+0

... vâng, tôi nghĩ vậy. Tôi tin rằng tôi đã nhầm lẫn về chủ đề trên paragaraph đó khi tôi đọc nó. –

+1

Điều này thực sự làm rõ điều gì đó lớn hơn đối với tôi. Vì các gói có thể được chia thành nhiều tệp, tôi tự hỏi loại sắp xếp các tệp nào sẽ được sử dụng. Điều này dường như làm cho nó rõ ràng rằng thứ tự sẽ không liên quan, vì các biến được khởi tạo theo thứ tự sử dụng của chúng ... nếu điều đó có ý nghĩa. –

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