Toán tử chuyển nhượng bằng ngôn ngữ Go


83

Gần đây tôi đã chơi với ngôn ngữ lập trình mới của google Go

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


Câu hỏi hay và câu trả lời là việc sử dụng = để gán là một sai lầm. Bạn đã sớm biết rằng x + 2 = 4 là một phương trình không phải là một phép gán. Tuy nhiên, vì việc chuyển nhượng thường xuyên hơn nhiều so với việc kiểm tra tính bình đẳng, một số ngôn ngữ thống trị đã bắt đầu sử dụng "=" để chuyển nhượng từ rất sớm ... và quy ước đã bị mắc kẹt.
Rick O'Shea

Câu trả lời:


120

Các :=ký hiệu phục vụ cả hai như là một lời tuyên bố và như khởi tạo.

foo := "bar"

tương đương với

var foo = "bar"

foo = "bar"Bạn có thể hỏi tại sao không sử dụng like trong bất kỳ ngôn ngữ kịch bản nào? Đó 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' ?

39
name := "John"

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

var name string
name = "John"

Go được nhập tĩnh, 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

13
@peterSO nhưng var name = "John"là viết tắt của từ var name string = "John"viết tắt của hai dòng đã cho.
Dave C

2
@Dave C: Đặc tả ngôn ngữ lập trình Go là rõ ràng: "Khai báo biến ngắn ... là cách viết tắt của khai báo biến thông thường có biểu thức khởi tạo nhưng không có kiểu: "var" IdentifierList = ExpressionList .".
peterSO

7
@peterSO Tôi biết, tôi cũng đã đọc. Điều đó không thay đổi những gì tôi đã nói. Câu trả lời này là chính xác.
Dave C

1
@KennethWorden Nó cản trở khả năng đọc như thế nào? Nó giảm thiểu những thông tin không cần thiết. Các ngôn ngữ có suy luận kiểu hoàn chỉnh là một ví dụ điển hình về lý do tại sao đây là một điều tốt.
Joonazan

18

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

Khai báo biến ngắn

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

ShortVarDecl = IdentifierList ":=" ExpressionList .

Đây là cách 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ó kiểu:

"var" IdentifierList = ExpressionList .

Bài tập

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

Trong name := "John"cờ vây , là viết tắt của var name = "John".


11

Rob Pike giải thích tại sao cờ vây lại có :=trong buổi nói chuyện "Nguồn gốc của cờ vây" (2010).

:=là một toán tử giả trong một ngôn ngữ khác do Pike ký tên là Newsquek (1989). Có ký hiệu Pascal-ish và khả năng suy ra kiểu để khai báo và khởi tạo thành ngữ ( trang 15 )

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

Lưu ý ngoài lề: Robert Griesemer đưa ra người := điều hành trả lời câu hỏi "Bạn rút ra được một thứ từ cờ vây là gì?" trong phiên QA tại Google I / O 2013. Nhắc đến nó là thuận tiện nhưng có vấn đề .


4

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

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

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

Khai báo biến ngắn là cách viết tắt của khai báo biến thông thường có biểu thức khởi tạo nhưng không có kiểu.

Đọc chi tiết bên dưới:

Khai báo biến

Khai báo biến ngắn


4

Có ít nhất một sự khác biệt nhỏ giữa

name := "John"

var name = "John"

Câu lệnh trước là câu lệnh không khai báo và không được phép bên ngoài thân hàm, trong khi câu lệnh sau là câu lệnh hợp lệ ở cấp độ gói.


2

Bối cảnh quan trọng cho câu trả lời:

:=là một toán tử viết tắt để khởi tạo một biến. Trong Go , các thao tác sau là tương đương:

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

Câu trả lời:

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

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

Bây giờ người dùng đã tạo mã đó có ý định gán lại twocho myNumbhay anh ta đã nhập sai myNumbthay vì nhập chính xác myNumbTwo? Bằng cách thêm dấu hai chấm vào :=, lập trình viên sẽ phải phạm hai lỗi (quên dấu hai chấm và quên dấu var) để có lỗi, do đó làm giảm đáng kể xác suất làm như vậy .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.