2015-01-13 11 views
17

Theo tài liệu tham khảo Go có hai cách để khai báo một biếnTại sao có hai cách để khai báo các biến trong Go, sự khác biệt và cách sử dụng nào?

Variable_declarations (trong định dạng của var count = 0 hoặc var count int)

Short_variable_declarations (trong định dạng của count := 0)

tôi thấy nó rất gây nhầm lẫn để quyết định sử dụng cái nào.

Sự khác biệt tôi biết (cho đến bây giờ) là rằng:

  • Tôi chỉ có thể sử dụng một định dạng count := 0 khi trong phạm vi của một hàm.
  • count := 0 có thể là redeclared trong số tuyên bố ngắn đa biến.

Nhưng chúng hoạt động giống như theo như tôi biết. Và trong tài liệu tham khảo nó cũng says:

Nó (count:=0 chiều) là viết tắt cho một khai báo biến thường xuyên với các biểu thức khởi tạo nhưng không có loại

nhầm lẫn của tôi là:

  • Nếu người ta chỉ là cách viết tắt của người khác, tại sao họ hành xử khác nhau?
  • Trong trường hợp nào, tác giả của Go thực hiện hai cách để khai báo một biến (tại sao chúng không được hợp nhất thành một cách)? Chỉ để gây nhầm lẫn cho chúng ta?
  • Có bất kỳ khía cạnh nào khác mà tôi nên để mắt mở khi sử dụng chúng, trong trường hợp tôi rơi vào hố?

Trả lời

29

Variable declarations làm rõ rằng các biến được khai báo. Từ khóa var là bắt buộc, ngắn gọn và thể hiện những gì được thực hiện (ở cấp tệp, mọi thứ trừ nhận xét phải bắt đầu bằng từ khóa, ví dụ: package, import, const, type, var, func). Giống như bất kỳ khối khác, khai báo biến có thể được nhóm lại như sau:

var (
    count int 
    sum float64 
) 

Bạn không thể làm điều đó với Short variable declarations. Ngoài ra, bạn có thể sử dụng các khai báo biến mà không chỉ định giá trị ban đầu trong trường hợp mỗi biến sẽ có giá trị bằng không của loại của nó. Khai báo biến ngắn không cho phép điều này, bạn phải xác định giá trị ban đầu.

Một nguyên tắc thiết kế hướng dẫn của Go là làm cho cú pháp sạch sẽ. Nhiều câu lệnh yêu cầu hoặc thuận tiện là chúng cho phép khai báo các biến cục bộ sẽ chỉ có sẵn trong phần thân của câu lệnh như for, if, switch ... Để làm cho cú pháp sạch hơn và ngắn hơn, khai báo biến ngắn được biện minh trong các trường hợp này và nó là những gì họ làm.

for idx, value := range array { 
    // Do something with index and value 
} 

if num := runtime.NumCPU(); num > 1 { 
    fmt.Println("Multicore CPU, cores:", num) 
} 

Một điểm khác biệt: khai báo lại

Trích dẫn từ đặc điểm kỹ thuật Ngôn Ngữ:

Không giống như khai báo biến thông thường, một khai báo biến ngắn có thể redeclare biến với điều kiện họ ban đầu được công bố trước đó trong cùng một khối có cùng loại và ít nhất một trong các biến không trống là mới. Kết quả là, redeclaration chỉ có thể xuất hiện trong một khai báo ngắn đa biến. Redeclaration không giới thiệu một biến mới; nó chỉ gán một giá trị mới cho bản gốc.

Điều này cũng hữu ích. Giả sử bạn muốn làm xử lý lỗi thích hợp, bạn có thể tái sử dụng một biến err vì rất có thể bạn chỉ cần nó để kiểm tra nếu có bất kỳ lỗi nào trong suốt cuộc gọi chức năng cuối cùng:

var name = "myfile.txt" 

fi, err := os.Stat(name) // fi and err both first declared 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println(name, fi.Size(), "bytes") 

data, err := ioutil.ReadFile(name) // data is new but err already exists 
            // so just a new value is assigned to err 
if err != nil { 
    log.Fatal(err) 
} 

// Do something with data 
+0

Quá nhanh và nhiều hơn nữa chi tiết hơn tôi. Câu trả lời hay. +1 –

+1

Cảm ơn câu trả lời của bạn, nhưng tại sao họ không thích chúng tôi sử dụng định dạng ': =' bên ngoài phạm vi chức năng? Tôi không thể tìm thấy điều đó có thể gây hại. – armnotstrong

+3

@armnotstrong Ở cấp độ tệp, mọi thứ (chú thích bị loại trừ) phải bắt đầu bằng từ khóa, ví dụ: 'package',' import', 'const',' type' 'var',' func'. – icza

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