1. ตัวแปรและค่าคงที่

ใน Golang ตัวแปรและค่าคงที่เป็นแนวคิดพื้นฐานสองประการที่มีบทบาทสำคัญมากในโปรแกรม

  • ตัวแปร (variable) คือตัวบ่งชี้ที่ถูกใช้เก็บข้อมูลในโปรแกรม ใน Golang ใช้คำว่า var เพื่อประกาศตัวแปร
  • ค่าคงที่ (constant) คือตัวบ่งชี้ซึ่งค่าไม่สามารถเปลี่ยนแปลงได้ในโปรแกรม ใน Golang ใช้คำว่า const เพื่อประกาศค่าคงที่

2 การประกาศและกำหนดค่าตัวแปรใน Golang

2.1 การประกาศและกำหนดค่าของตัวแปรเดี่ยว

ในภาษา Go ใช้คำว่า var เพื่อประกาศตัวแปรด้วยรูปแบบ var ชื่อตัวแปร ประเภท หลังจากการประกาศแล้ว ตัวแปรสามารถได้รับค่าในโค้ดต่อมา หรือสามารถกำหนดค่าตั้งต้นที่เวลาของการประกาศ

var age int // ประกาศตัวแปรจำนวนเต็มชื่อ age
age = 25    // กำหนดค่าให้กับตัวแปร

var name string = "Alice" // ประกาศและกำหนดค่าตัวแปรชื่อ name

2.2 การประกาศของตัวแปรมากตัวพร้อมกัน

ภาษา Go รองรับการประกาศของตัวแปรหลายตัวพร้อมกันซึ่งทำให้โค้ดเขียนได้อย่างกระชับ การประกาศเป็นชุดมักทำที่จุดเริ่มต้นของฟังก์ชันหรือที่ระดับแพคเกจ เช่น:

var (
    firstName, lastName string
    age                 int
)

firstName = "John"
lastName = "Doe"
age = 30

ในการประกาศเป็นชุดข้างต้น firstName และ lastName ถูกประกาศเป็นสตริง ในขณะที่ age เป็นจำนวนเต็ม

2.3 การโอนเรียกและประกาศตัวแปรแบบสั้น

ในภาษา Go ไม่จำเป็นต้องระบุประเภทของตัวแปรเสมอ เมื่อมีการกำหนดค่าเริ่มต้นเมื่อประกาศตัวแปร ภาษา Go สามารถโอนเรียกประเภทของตัวแปรได้ เรียกว่า การโอนเรียกแบบสั้น จะช่วยเรียกและกำหนดค่าตัวแปรโดยใช้การโอนเรียกแบบสั้น := ซึ่งช่วยกระชับคำสั่งในการประกาศและกำหนดค่าตัวแปรโดยใช้การโอนเรียก เช่น:

city := "Beijing" // โอนเรียกและกำหนดค่าเริ่มต้นให้กับ city
country := "China" // country ถูกโอนเรียกและแทนค่าเป็นสตริง

ควรระวังว่า การประกาศแบบสั้นสามารถใช้ได้ภายในฟังก์ชันเท่านั้น และไม่สามารถใช้ในตัวแปรระดับแพคเกจ

2.4 การประกาศตัวแปรนอกขอบเขตของฟังก์ชัน

ตัวแปรที่ประกาศนอกขอบเขตของฟังก์ชัน มีขอบเขตด้านแพคเกจ ตัวแปรเหล่านี้ต้องการดูแลรักษาได้อย่างระมัดระวังเพื่อป้องกันปัญหาการชนกันของชื่อและการอ้างอิงที่ไม่ชัดเจน

var globalVar string = "ฉันคือตัวแปรโกลบอล" // การประกาศตัวแปรโลกัล

func printGlobalVar() {
    fmt.Println(globalVar) // การเข้าถึงตัวแปรโลกัลภายในฟังก์ชัน
}

ตัวแปรโลกัลสามารถใช้ร่วมกันระหว่างฟังก์ชันในแพคเกจได้ แต่ต้องใช้อย่างระมัดระวังเพื่อป้องกันปัญหาการชนชื่อและการอ้างอิงที่ไม่ชัดเจน

คำแนะนำ: ความเข้าใจเกี่ยวกับโค้ดฟังก์ชันพื้นฐานที่นี่เพียงพอ การอธิบายเพิ่มเติมเกี่ยวกับฟังก์ชันจะถูกนำเสนอในส่วนถัดไป

4.1 ตัวแปรภายในฟังก์ชัน

ตัวแปรภายใน (Local variables) คือตัวแปรที่ถูกกำหนดของภายในฟังก์ชัน และสามารถเข้าถึงได้ในเฉพาะฟังก์ชันนั้น ๆ เท่านั้น พารามิเตอร์ของฟังก์ชันก็เป็นตัวแปรภายในด้วย ตั้งแต่สร้างขึ้นมาจนกระทำการทำงานของฟังก์ชันเสร็จ ตัวแปรภายในก็จะหายไป ทุกครั้งที่มีการเรียกใช้ฟังก์ชัน ตัวแปรภายในก็จะถูกสร้างขึ้นมาใหม่

func localVariableExample() {
    var localVariable int = 10 // นี่คือตัวแปรภายใน
    fmt.Println(localVariable)
}

func main() {
    localVariableExample() // ผลลัพธ์: 10
    // fmt.Println(localVariable) // นี่จะทำให้เกิดข้อผิดพลาดในการคอมไพล์เนื่องจาก localVariable ไม่สามารถมองเห็นได้ที่นี่
}

ในตัวอย่างข้างต้น localVariable สามารถเข้าถึงได้เฉพาะในฟังก์ชัน localVariableExample เท่านั้น

4.2 ตัวแปรโกลบอล

ตัวแปรโกลบอล (Global variables) คือตัวแปรที่ถูกกำหนดนอกฟังก์ชัน และสามารถเข้าถึงได้ในไฟล์ใดก็ต่อมาในแพ็กเกจเดียวกัน ถ้าคุณต้องการใช้ตัวแปรโกลบอลในแพ็กเกจอื่น ๆ ชื่อของตัวแปรจะต้องขึ้นต้นด้วยตัวพิมพ์ใหญ่ ตามกฎของการควบคุมการเข้าถึงของภาษา Go

package main

import "fmt"

var globalVariable int = 20 // นี่คือตัวแปรโกลบอล

func main() {
    fmt.Println(globalVariable) // ผลลัพธ์: 20
    changeGlobal()
    fmt.Println(globalVariable) // ผลลัพธ์: 30
}

func changeGlobal() {
    globalVariable = 30 // เปลี่ยนค่าของตัวแปรโกลบอล
}

ในตัวอย่างนี้ globalVariable สามารถมองเห็นได้ทั้งในฟังก์ชัน main และฟังก์ชัน changeGlobal

5 การประกาศและการใช้ค่าคงที่

5.1 คำสำคัญ const

เราใช้คำสำคัญ const เพื่อกำหนดค่าคงที่ ค่าคงที่คือค่าที่ไม่สามารถแก้ไขได้ และหลังจากกำหนดแล้ว ค่าของมันไม่สามารถเปลี่ยนแปลงได้อีก ค่าคงที่สามารถเป็นของประเภทข้อมูลพื้นฐานใดๆ เช่น เลขจำนวนเต็ม ทศนิยม เป็นต้น

const Pi = 3.14 // ประกาศค่าคงที่เป็นเลขทศนิยม
const StrConst string = "สวัสดี, โลก!" // ประกาศค่าคงที่เป็นสตริง

func main() {
    fmt.Println(Pi)
    fmt.Println(StrConst)
}

5.2 ค่าคงที่แบบ Enum

ภาษา Go ไม่มีชนิดข้อมูลที่แตกต่างเฉพาะเรื่องการจัดลำดับ แต่คุณสามารถใช้คำสำคัญ iota เพื่อให้ค่าคงที่เพิ่มขึ้นตามลำดับได้ ในบล็อก const การประกาศคงที่เพิ่มขึ้นหลังคำสำคัญ iota จะเพิ่มค่าของ iota ขึ้นทีละ 1

const (
    Sunday = iota  // 0
    Monday         // 1
    Tuesday        // 2
    Wednesday      // 3
    Thursday       // 4
    Friday         // 5
    Saturday       // 6
)

func main() {
    fmt.Println(Sunday)    // ผลลัพธ์: 0
    fmt.Println(Saturday)  // ผลลัพธ์: 6
}

โค้ดข้างต้นประกาศการจัดลำดับสำหรับวันในสัปดาห์ โดยที่ iota จะเริ่มต้นที่ 0 ภายในบล็อก const และเพิ่มขึ้นทีละ 1 สำหรับการประกาศต่อไปทุกครั้ง

5.3 ขอบเขตของค่าคงที่

ขอบเขตของค่าคงที่คล้ายกับตัวแปร หากค่าคงที่ถูกกำหนดข้างในฟังก์ชัน ขอบเขตของมันจะถูกจำกัดอยู่ในฟังก์ชันนั้น ๆ หากค่าคงที่ถูกกำหนดด้านนอกฟังก์ชัน (โกลบอล) ขอบเขตของมันคือทั้งแพ็คเกจ และหากตัวอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ มันสามารถเข้าถึงได้ในแพ็คเกจอื่น

การจัดการขอบเขตของค่าคงที่ช่วยลดการปนเปื้อนของขอบเขตทั่วๆ ไปและทำให้โปรแกรมง่ายต่อการบำรุงรักษาและอ่านง่ายขึ้น

const GlobalConst = "นี่คือค่าคงที่ที่เป็นโกลบอล"

func main() {
    const LocalConst = "นี่คือค่าคงที่ที่เป็นภายในฟังก์ชัน"
    fmt.Println(GlobalConst)  // นี่ถูกต้อง
    fmt.Println(LocalConst)   // นี่ถูกต้อง
}

func anotherFunction() {
    // fmt.Println(LocalConst) // นี่จะทำให้เกิดข้อผิดพลาดในการคอมไพล์: LocalConst ไม่สามารถมองเห็นได้ในฟังก์ชันนี้
    fmt.Println(GlobalConst)  // นี่ถูกต้อง
}

ในตัวอย่างนี้ LocalConst สามารถเข้าถึงได้เฉพาะในฟังก์ชัน main ในขณะที่ GlobalConst สามารถเข้าถึงได้ทั่วทั้งแพ็คเกจ