DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

การเปรียบเทียบข้อมูลของ Go

#go

แน่นอนว่าภาษาเขียนโปรแกรมต้องมีวิธีการเปรียบเทียบข้อมูลในตัวภาษาให้เราใช้งาน สำหรับ 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)