Sự khác biệt giữa: = và = toán tử trong Go


283

Sự khác biệt giữa các toán tử =:=toán tử là gì và các trường hợp sử dụng cho chúng là gì? Cả hai dường như là cho một nhiệm vụ?


2
Cũng xem điều này : Hướng dẫn trực quan biến . Tôi đã viết một bài báo về nó.
Inanc Gumus

1
Các ngữ nghĩa ...
JustDave

Nếu bạn muốn sử dụng một loại cụ thể x := uint32(123)làm việc chẳng hạn. Nó phải rõ ràng đối với hầu hết mọi người nhưng tôi đã phải suy nghĩ vài phút ;-)
Kenji Noguchi

Câu trả lời:


198

Chỉ =là toán tử gán.

:=là một phần của cú pháp của mệnh đề khai báo biến ngắn .

Có một số quy tắc mặc dù. Xem câu trả lời khác này để biết thêm chi tiết.


Vì vậy, nó có nghĩa là biến với loại suy ra? đúng?
Krupal Shah

@KrupalShah liên kết đến các tài liệu nói theo nghĩa đen - "Đây là cách viết tắt của 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:" golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
Có vẻ như :=được liệt kê là một nhà điều hành ở đây golang.org/ref/spec#Operators_and_puncinating , vì vậy tôi không chắc chắn tôi đồng ý rằng " :=thực sự không phải là một nhà điều hành"
Powers

347

Trong Go, :=là để khai báo + gán, trong khi =chỉ dành cho chuyển nhượng.

Ví dụ, var foo int = 10 giống như foo := 10.


4
Có một trường hợp sử dụng cho =trái ngược với :=? Bạn có nên luôn luôn sử dụng :=?
Kenny Worden

3
@KennethWorden Go sẽ không cho phép bạn sử dụng :=để gán cho một biến đã được khai báo, trừ khi bạn đang gán cho nhiều biến cùng một lúc và ít nhất một trong số các biến đó là mới.
Kenny Bania

5
các intlà không cần thiết, var foo = 10cũng giống nhưfoo := 10
Gary Lyn

@KennyWorden, vâng. Bạn không thể sử dụng: = bên ngoài một chức năng.
Karuhanga

105

Như những người khác đã giải thích, :=là cho cả khai báo, chuyển nhượng, và cũng để khai báo; và nó đoán ( infers ) kiểu của biến tự động.

Ví dụ: foo := 32là một dạng ngắn hạn của:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Có một số quy tắc: * /

★ Quy tắc 1:

Bạn không thể sử dụng :=hết funcs. Đó là bởi vì, trong bất kỳ func nào, một câu lệnh nên bắt đầu bằng một từ khóa.

// no keywords below, illegal.
illegal := 42

// `var` keyword makes this statement legal.
var legal = 42

func foo() {
  alsoLegal := 42
  // reason: it's in a func scope.
}

★ Quy tắc thứ 2:

Bạn không thể sử dụng chúng hai lần ( trong cùng phạm vi ):

legal := 42
legal := 42 // <-- error

Bởi vì, :=giới thiệu "một biến mới" , do đó sử dụng nó hai lần không tái phân phối biến thứ hai, vì vậy nó là bất hợp pháp.


★ Quy tắc thứ 3:

Bạn có thể sử dụng chúng cho các khai báo và bài tập đa biến:

foo, bar   := 42, 314
jazz, bazz := 22, 7

★ Quy tắc thứ 4 (Tuyên bố lại):

Bạn có thể sử dụng chúng hai lần trong khai báo "đa biến" , nếu một trong các biến là mới :

foo, bar  := someFunc()
foo, jazz := someFunc()  // <-- jazz is new
baz, foo  := someFunc()  // <-- baz is new

Điều này là hợp pháp, bởi vì, bạn không khai báo tất cả các biến, bạn chỉ cần gán lại các giá trị mới cho các biến hiện có và khai báo các biến mới cùng một lúc. Điều này được gọi là khai báo lại .


★ Quy tắc thứ 5:

Bạn có thể sử dụng khai báo ngắn để khai báo một biến trong phạm vi mới hơn ngay cả biến đó đã được khai báo có cùng tên trước đó:

var foo int = 34

func some() {
  // because foo here is scoped to some func
  foo := 42  // <-- legal
  foo = 314  // <-- legal
}

Ở đây, foo := 42là hợp pháp, bởi vì, nó tuyên bố footrong some()phạm vi của func. foo = 314là hợp pháp, bởi vì, nó chỉ gán một giá trị mới cho foo.


★ Quy tắc thứ 6:

Bạn có thể khai báo cùng tên trong các khối lệnh ngắn như: if , for , switch :

foo := 42
if foo := someFunc(); foo == 314 {
  // foo is scoped to 314 here
  // ...
}
// foo is still 42 here

Bởi vì, footrong if foo := ..., chỉ thuộc về ifđiều khoản đó và nó thuộc một phạm vi khác.


Vì vậy, như một quy tắc chung: Nếu bạn muốn dễ dàng khai báo một biến bạn có thể sử dụng :=hoặc, nếu bạn chỉ muốn ghi đè lên một biến hiện có, bạn có thể sử dụng =.

Người giới thiệu:


21

:= là một tay ngắn để khai báo.

a := 10
b := "gopher"

asẽ được khai báo là một intvà được khởi tạo với giá trị 10trong đó bsẽ được khai báo dưới dạng chuỗi và được khởi tạo với giá trị gopher.

Tương đương của họ sử dụng =sẽ là

var a = 10
var b = "gopher"

=là toán tử gán. Nó được sử dụng giống như cách bạn sẽ sử dụng nó trong bất kỳ ngôn ngữ nào khác.

Bạn có thể bỏ qua loại khi bạn khai báo biến và trình khởi tạo có mặt ( http://tour.golang.org/#11 ).


«= Là toán tử gán. Nó được sử dụng giống như cách bạn sử dụng nó trong bất kỳ ngôn ngữ nào khác. » Ngoại trừ ở Ada, nơi =chỉ để so sánh và :=dành cho nhiệm vụ ...
Alexis Wilke

13

Dấu: = có nghĩa là khai báo gán trong khi = có nghĩa là chỉ cần gán.


11

:=khai báo và chuyển nhượng, =chỉ cần gán

Nó hữu ích khi bạn không muốn điền mã của mình bằng các khai báo kiểu hoặc cấu trúc.

// Usage with =
var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2

// Usage with :=
i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)

7

từ tài liệu tham khảo: ( tour.golang.org )

Bên trong một hàm , :=câu lệnh gán ngắn có thể được sử dụng thay cho khai báo var với kiểu ẩn.

Bên ngoài một hàm , mọi cấu trúc bắt đầu bằng một từ khóa (var, func, v.v.) và cấu trúc: = không có sẵn.



2

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

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

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

Một khai báo biến ngắn là một tốc ký cho 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.

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

Khai báo biến

Khai báo biến ngắn


10
Tôi nghĩ rằng cú pháp của bạn là sai cho ví dụ đầu tiên. Thay vì: var firstName: = "John", nó phải là: var firstName = "John"
Gino
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.