2013-05-13 28 views
59

Gần đây tôi đã chơi với ngôn ngữ lập trình mới của google GoChuyển nhượng nhà điều hành tại Gò ngôn ngữ

và đã tự hỏi tại sao toán tử gán := có dấu hai chấm ở phía trước của dấu bằng = Có một lý do cụ thể tại sao các tác giả của ngôn ngữ muốn sử dụng name := "John" thay vì name = "John"

Trả lời

89

Ký hiệu := phục vụ cả dưới dạng khai báo và khởi tạo.

foo := "bar" 

tương đương với

var foo = "bar" 

Tại sao không chỉ foo = "bar" sử dụng như thế nào trong bất kỳ ngôn ngữ kịch bản, bạn có thể yêu cầu? Vâng, đó là để tránh lỗi chính tả.

foo = "bar" 
fooo = "baz" + foo + "baz" // Oops, is fooo a new variable or did I mean 'foo' ? 
17

:= không phải là toán tử gán. Đó là một tuyên bố biến ngắn. = là toán tử gán.

Short variable declarations

Một khai báo biến ngắn sử dụng cú pháp:

ShortVarDecl = IdentifierList ":=" ExpressionList .

Nó là viết tắt của một khai báo biến thường xuyên với initializer biểu nhưng không có các loại:

"var" IdentifierList = ExpressionList .

Assignments

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

Trong Go, name := "John" là viết tắt cho var name = "John".

27
name := "John" 

chỉ là cú pháp đường cho

var name string 
name = "John" 

Go là tĩnh đánh máy, vì vậy bạn phải khai báo các biến.

+6

'name: =" John "' là viết tắt của 'var name =" John "'. – peterSO

+8

@peterSO nhưng 'var name =" John "' viết tắt của 'var name string =" John "' viết tắt của hai dòng được cho. –

+2

@Dave C: [Đặc tả ngôn ngữ lập trình đi] (http://golang.org/ref/spec#Short_variable_declarations) là rõ ràng: "Một khai báo biến ngắn ... là viết tắt của một khai báo biến thông thường với các biểu thức khởi tạo nhưng không có loại: '" var "IdentifierList = ExpressionList .'". – peterSO

4

Cả hai đều là kỹ thuật khai báo biến khác nhau trong ngôn ngữ Go.

var name = "John" // is a variable declaration 

name := "John" // is a short variable declaration. 

Một khai báo biến ngắn là viết tắt của 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.

đọc dưới đây để xem chi tiết:

Variable declarations

Short variable declarations

6

Rob Pike explains tại sao Go có := trong buổi nói chuyện "Nguồn gốc của Go" (2010).

:= là một toán tử giả trong ngôn ngữ khác được Pike gọi là Newsquek (1989). nào có ký hiệu Pascal-ish và khả năng suy luận kiểu cho khai báo và khởi tạo thành ngữ (page 15)

// variable: [type] = value 
x: int = 1 
x := 1 

lưu ý Marginal: Robert Griesemer brings up:= điều hành trả lời câu hỏi "Điều gì sẽ là một điều bạn đưa ra từ Đi?" trong phiên QA tại Google I/O 2013. Gọi nó là thuận tiện nhưng có vấn đề.

1

bối cảnh quan trọng cho sự trả lời:

:= là một nhà điều hành viết tắt cho khởi tạo một biến. Trong Go, các hoạt động sau đây là tương đương:

var myNumb String = "one" 
myNumb := "one" 

Trả lời:

Câu hỏi ngụ ý bây giờ là: "Tại sao anh đi thiết kế các ký hiệu viết tắt := để có một : trước =" . Lý do là để ngăn chặn lỗi chính tả phổ biến. Nếu toán tử gán tốc ký chỉ là =, sau đó bạn có thể có những tình huống sau đây:

var myNumb String = "one" 
myNumb = "two" 

Bây giờ đã làm người dùng tạo mã mà có ý định chuyển nhượng lại sách two-myNumb, hoặc ông đã nhập nhầm myNumb thay vì đúng cách gõ myNumbTwo? Bằng cách bao gồm dấu hai chấm trong :=, trình lập trình sẽ phải thực hiện hai lỗi (quên dấu hai chấm và quên số var) để có lỗi, do đó làm giảm khả năng làm như vậy mạnh mẽ.

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