So sánh các giá trị Go

Khả năng so sánh theo loại

Các kiểu dữ liệu cơ bản luôn được so sánh bằng cách sử dụng==!=toán tử:số nguyêngiá trị,dấu phẩy độngsố,phức tạpsố,booleangiá trị,chuỗigiá trị,không thay đổicác giá trị.

Mảngcác giá trị có thể so sánh được, nếu chúng chứa loại phần tử có thể so sánh được

Con trỏcác giá trị có thể so sánh được.

Kênhcác giá trị có thể so sánh được.

Giao diệncác giá trị có thể so sánh được.

So sánhgiao diệngiá trị chỉ hoạt động nếu kiểu động có thể so sánh được.

Chức nănggiá trị,Látgiá trị vàBản đồgiá trị làkhông phảicó thể so sánh, chúng chỉ có thể được so sánh vớinil, như một trường hợp đặc biệt.

Quy tắc so sánh

Từ thông số kỹ thuật Go:

  • Booleancác giá trị có thể so sánh được. Hai giá trị boolean bằng nhau nếu chúng là cả haitruehoặc cả haifalse.

  • Số nguyêncác giá trị có thể so sánh và sắp xếp theo cách thông thường.

  • Dấu chấm độngcác giá trị có thể so sánh và sắp xếp, như được định nghĩa bởiIEEE-754Tiêu chuẩn.

  • Phức tạpcác giá trị có thể so sánh được. Hai giá trị phức u và v bằng nhau nếu cả haireal(u) == real(v)andtưởng tượng (u) == hình ảnh (v) `.

  • Chuỗicác giá trị có thể so sánh và được sắp xếp theo thứ tự theo từng byte.

  • Con trỏcác giá trị có thể so sánh được. Hai giá trị con trỏ bằng nhau nếu chúng trỏ đến cùng một biến hoặc nếu cả hai đều có giá trịnil. Con trỏ đến các biến kích thước 0 khác biệt có thể bằng hoặc không.

  • Kênhcác giá trị có thể so sánh được. Hai giá trị kênh bằng nhau nếu chúng được tạo bởi cùng một lệnh gọi để thực hiện hoặc nếu cả hai đều có giá trịnil.

  • Giao diệncác giá trị có thể so sánh được. Hai giá trị giao diện bằng nhau nếu chúng có kiểu động giống nhau và giá trị động bằng nhau hoặc nếu cả hai đều có giá trịnil.

  • Một giá trị x củakhông giao diệnkiểuXvà một giá trịtcủagiao diệnkiểuTcó thể so sánh được khi các giá trị của loạiXcó thể so sánh vàXdụng cụT. Chúng bằng nhau nếutkiểu động của giống hệt vớiXvà giá trị động của t bằngx.

  • Cấu trúccác giá trị có thể so sánh được nếu tất cả các trường của chúng đều có thể so sánh được. Hai giá trị struct bằng nhau nếu các trường không trống tương ứng của chúng bằng nhau.

  • Mảngcác giá trị có thể so sánh được nếu các giá trị của kiểu phần tử mảng có thể so sánh được. Hai giá trị mảng bằng nhau nếu các phần tử tương ứng của chúng bằng nhau.

So sánh thất bại

Nếu cấu trúc chứa trường có kiểu không so sánh được, bạn sẽ gặp lỗi thời gian biên dịch khi so sánh.

So sánh các loại không thể so sánh: enterrefect.DeepEqual()

Cácreflectgói stdlib cung cấpreflect.DeepEqual()hàm có 2 kiểu và trả về boolean:

func DeepEqual(x, y interface{}) bool

Giá trị của các loại riêng biệt không bao giờ bằng nhau, vì vậy nếu bạn vượt qua 2 loại khác nhau, bạn sẽ luôn nhận đượcfalse.

Mảngcác giá trị bằng nhau sâu sắc khi các phần tử tương ứng của chúng bằng nhau.

Cấu trúccác giá trị bằng nhau sâu sắc nếu các trường tương ứng của chúng bằng nhau.

Chức năngcác giá trị rất bằng nhau nếu cả hai đềunil; nếu không thì chúng không bằng nhau sâu sắc.

Giao diệncác giá trị là ngang nhau sâu sắc nếu chúng có các giá trị cụ thể bằng nhau.

Bản đồcác giá trị hoàn toàn bằng nhau khi tất cả những điều sau đây đều đúng: - cả hai đềunilhoặc cả hai khôngnil- chúng có cùng độ dài - chúng là cùng một đối tượng bản đồ hoặc các khóa tương ứng của chúng (được so khớp bằng cách sử dụng bình đẳng Go) ánh xạ đến các giá trị bằng nhau sâu sắc.

Con trỏcác giá trị hoàn toàn bằng nhau nếu chúng bằng nhau bằng cách sử dụng Go==toán tử hoặc nếu chúng trỏ đến các giá trị bằng nhau.

Látcác giá trị hoàn toàn bằng nhau khi tất cả những điều sau đây đều đúng: - cả hai đềunilhoặc cả hai khôngnil- chúng có cùng độ dài, - chúng trỏ đến cùng một mục nhập ban đầu của cùng một mảng cơ bản (nghĩa là&x[0] == &y[0]) hoặc các phần tử tương ứng của chúng (tính đến độ dài) bằng nhau sâu sắc.

Một lát trống không phải con số và mộtnillát (ví dụ:[]byte{}[]byte(nil)) không bằng nhau sâu sắc.

Các giá trị khác -con số,người ngu ngốc,dây, vàkênh truyền hình- rất bằng nhau nếu chúng bằng nhau bằng cách sử dụng toán tử == của Go.

Một số trường hợp “đặc biệt” không thể tránh khỏi đáng được liệt kê:nó có thể cho một giá trị là không bình đẳng với chính nó: - bởi vì nó là củafuncloại - vì nó là dấu phẩy độngNaNgiá trị - bởi vì nó là mộtmảng,cấu trúc, hoặc làgiao diệnchứa một giá trị như vậy

Các giá trị con trỏ luôn bằng với chính chúng, ngay cả khi chúng trỏ đến hoặc chứa các giá trị có vấn đề như vậy, bởi vì chúng so sánh bằng nhau bằng cách sử dụng Go==và đó là điều kiện đủ để bình đẳng sâu sắc, không phụ thuộc vào nội dung.

Ứng dụng tương tựlátbản đồ: nếuxylà cùng một lát cắt hoặc cùng một bản đồ, chúng rất giống nhau bất kể nội dung.


Các hướng dẫn về go khác: