[โคตรนูบ]เกรียนรู้การใช้ตัวแปรของโกด้วยโกคู

dragonball_goku_002_52065

ตอนเด็กๆ โคตรอยากได้เครื่องวัดพลังของชาวไซย่ามากมาย จะได้มาเบ่งพลังข่มกันกับเพื่อนที่โรงเรียน ไหนๆ เราก็ไล่ตามความฝันวัยเด็กกันอยู่แล้ว มาลองสร้างให้เป็นจริงไปพร้อมๆกับการเรียนรู้โกด้วยโกคูกันเถอะ

ลองดูโปรแกรมนี้กัน

func main() {
  power := getPower()
}

func getPower() int {
  return 9001
}

นูบบางคนอาจสังเกตุว่าเอ๊ะเคยเห็นไอ้ := จากภาษาปาสคาลนี่หว่า (ดักแก่… ใช่แล้วครับผมโดนบังคับเรียนตอน ปี1 เป็นภาษาที่โคตรสตริกเลย ผิดนิดผิดหน่อยก็โดนด่า) อันนี้ในโกเป็น “โอเปอรเตอร์ประกาศตัวแปรแบบลัด” โดยรับค่าที่ส่งกลับมาจาก ฟังค์ชั่น getPower() และแน่นอนจะเห็นค่า 9001 เป็น int กลับมา
ให้จำไว้ว่า := ใช้เพื่อประกาศ(declare) ไปพร้อมๆกับการตั้งค่า (assign) ตัวแปร ทำไมรึ ก็เพราะว่าตัวแปรไม่สามารถประกาศซ้ำได้ (ภายใต้ Scope เดียวกัน เอ สโคปคืออะไร? เดียวจะบอกต่อไปนะ) ถ้าคุณพยายามทำอย่างนี้จะเจอด่า

func main() {
  power := 9000
  fmt.Printf("It's over %d\n", power)

// COMPILER ERROR:
// no new variables on left side of :=
  power := 9001
  fmt.Printf("It's also over %d\n", power)
}

คอมไพลเลอร์จะบ่นออกมาว่า “ไม่มีตัวแปรใหม่(หลายตัว)ทางด้านซ้ายของ := นะจ๊ะ” นั่นหมายความว่าเมื่อเรา “ประกาศ” และ “ป้อนค่า” ตัวแปรครั้งแรก เราใช้ := แต่ต่อมาถ้าจะ “ป้อนค่า” ใหม่ เราจะใช้ = เพราะไม่สมารถประกาศไทป์ตัวแปรซ้ำได้อีกแล้ว เอ้าสังเกตุดูดีๆ นะจะพบว่าภาษาอังกฤษเค้าใช้ variables ซึ่งเป็นพหูพจน์ ก็เพราะโกให้คุณสามารถตั้งค่าได้พร้อมๆกันหลายตัวแปร! ว้าว!!

func main() {
  name, power := "Goku", 9000
  fmt.Printf("%s's power is over %d\n", name, power)
} 
Excerpt From: Karl Seguin. “The Little Go Book.” iBooks.

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

ลองดูนี่

func main() {
  power := 1000
  fmt.Printf("default power is %d\n", power)

  name, power := "Goku", 9000
  fmt.Printf("%s's power is over %d\n", name, power)
}
แม้ว่า power ของโกคูจะถูก “ตั้งค่า” ให้สองครั้งในสโคปเดียวกัน แต่คอมไพลเลอร์ก็ไม่บ่น เพราะว่ามันมีตัวแปรใหม่ name เพิ่มขึ้นมาด้านซ้ายของ := ด้วย อย่างไรก็ตามเราก็ไม่สามารถแก้ไขไทป์ของ power ได้ มันถูกประกาศเป็น integer โดยปริยาย และก็สามารถตั้งค่าไทป์ integer เท่านั้น

สุดท้าย

เหมือนกับการ import และอีกหลายอย่าง โกไม่ยอมให้คุณประกาศตัวแปรที่ไม่ถูกเรียกใช้ และการประกาศโดยไม่ป้อนค่าสามารถทำได้ โดยมันจะใส่ค่า “ศูนย์” ของไทป์นั้นๆให้เป็นค่าตั้งต้น เช่น “” คือค่าศูนย์ของสตริง หรือ 0 เป็นค่าศูนย์ของ Integer เป็นต้น

จากหนังสือ “The Little Go book”