แน่นอนว่าภาษาเขียนโปรแกรมต้องมีวิธีการเปรียบเทียบข้อมูลในตัวภาษาให้เราใช้งาน สำหรับ Go เตรียม operator สำหรับการเปรียบเทียบเอาไว้แล้วได้แค่
- == เท่ากัน
- != ไม่เท่ากัน
- > มากกว่า
- < น้อยกว่า
- >= มากกว่าหรือเท่ากับ
- <= น้อยกว่าหรือเท่ากับ
แต่ว่า operator ที่ลิสต์มานี้ก็มีเงื่อนไขตามแต่ละประเภทข้อมูลอีกว่าอะไรบ้างที่เปรียบเทียบกันได้ ซึ่งเงื่อนไขก็มีได้แก่
Boolean ข้อมูลประเภท bool เปรียบเทียบว่าเท่ากันหรือไม่เท่ากันได้ แต่เปรียบเทียบมากกว่าหรือน้อยกว่าไม่ได้ ซึ่งก็ง่ายๆเลย true เท่ากับ true และ false เท่ากับ false เพราะ bool มีค่าที่เป็นไปได้แค่นี้ ก็จะใช้ได้กับ operator == และ != เท่านั้น ใช้กับ operator อื่นๆที่เหลือไม่ได้
Integer ข้อมูลแบบจำนวนเต็ม เปรียบเทียบกันว่าเท่ากันหรือไม่เท่ากันได้ และ เปรียบเทียบมากว่าหรือน้อยกว่าได้ด้วย ดังนั้นก็ใช้ operator ทั้งหมดได้หมดเลย
Floating-point ข้อมูลแบบทศนิยม เปรียบเทียบกันว่าเท่ากันหรือไม่เท่ากันได้ และ เปรียบเทียบมากว่าหรือน้อยกว่าได้ด้วย แต่ก็ขึ้นอยู่กับมาตรฐาน IEEE-754 ที่เป็นมาตรฐานการเก็บข้อมูลแบบทศนิยมบนคอมพิวเตอร์
Complex ข้อมูลจำนวนเชิงซ้อน Go เป็นภาษานึงที่รองรับข้อมูลตัวเลขแบบนี้ในตัวภาษา ซึ่ง เปรียบเทียบว่าเท่ากันหรือไม่เท่ากันได้ แต่เปรียบเทียบมากกว่าหรือน้อยกว่าไม่ได้
String ข้อมูลแบบสตริง เปรียบเทียบกันว่าเท่ากันหรือไม่เท่ากันได้ และ เปรียบเทียบมากว่าหรือน้อยกว่าได้ด้วย ซึ่งการเปรียบเทียบมากน้อยเนี่ย จะไล่เทียบข้อมูลภายในทีละ byte เลยโดยเรียงจากตั้งแต่ byte แรก ถ้าเท่ากันก็เทียบ byte ถัดไป
Pointer ข้อมูลแบบ pointer ที่เก็บ memory address นั้นก็เปรียบเทียบว่าเท่ากันหรือไม่เท่ากันได้ แต่เปรียบเทียบมากกว่าหรือน้อยกว่าไม่ได้ คือถ้าจะเท่ากันก็ต้องเป็น address เดียวกัน หรือค่าเป็น nil ทั้งคู่นั่นเอง
Channel ข้อมูลแบบ channel ก็ เปรียบเทียบกันว่าเท่ากันหรือไม่เท่ากันได้ แต่เปรียบเทียบมากกว่าหรือน้อยกว่าไม่ได้ คือ channel เนี่ยเราสร้างค่ามันได้โดยใช้ฟังก์ชัน make ก็คือถ้าตัวแปร channel เกิดจากที่สร้างด้วย make ค่าเดิมก็แสดงว่าเท่ากัน หรือว่าเป็น nil ทั้งคู่ก็เท่ากันเช่นกัน
Struct ข้อมูลแบบ struct ก็ เปรียบเทียบกันว่าเท่ากันหรือไม่เท่ากันได้ แต่เปรียบเทียบมากกว่าหรือน้อยกว่าไม่ได้ ข้อมูลจะเท่ากันก็ต่อเมื่อทุก fields นั้นเป็นข้อมูลที่สามารถเปรียบเทียบกันได้ มีข้อมูลเท่ากัน
Array ข้อมูลแบบ Array ก็ เปรียบเทียบกันว่าเท่ากันหรือไม่เท่ากันได้ แต่เปรียบเทียบมากกว่าหรือน้อยกว่าไม่ได้ ข้อมูลจะเท่ากันก็ต่อเมื่อทุก ค่าในแต่ละตำแหน่งเทียบกันได้ และมีค่าเท่ากัน
ส่วนค่าของ Slice, map และ function นั้นเปรียบเทียบกันไม่ได้ เว้นแต่ว่าจะเทียบว่ามีค่าเท่ากับหรือไม่เท่ากับ nil เท่านั้น
สำหรับ Go นั้นเราเปลี่ยนแปลงกฏการเปรียบเทียบเหล่านี้อีกไม่ได้แล้ว เพราะเป็นสเปคของภาษาเลย ถ้าเราต้องการเปรียบเทียบด้วยกฎเกณฑ์อื่นๆ เราทำได้คือเขียน function หรือ method ในการเปรียบเทียบเองเท่านั้น ไม่สามารถแก้ไขกฎของ operator เหล่านี้ได้เอง
สำหรับการเปรียบเทียบค่าของ Interface นั้นก็เปรียบเทียบได้เช่นกัน แต่กฏค่อนข้างซับซ้อนเดียวแยกอธิบายอีกโพสต์นึงต่างหากเลย
กฎที่ยกมาสรุปนี้จริงๆแล้วก็เอามาจากรายละเอียดสเปคของภาษานั่นแหละ อ่านได้ที่ https://golang.org/ref/spec#Comparison_operators
Top comments (0)