จากบทความเรื่อง 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs
ทำการสรุปเรื่องต่าง ๆ ที่น่าสนใจสำหรับการพัฒนาระบบด้วยภาษา Go
ซึ่งเป็นสิ่งที่นักพัฒนาทั้งผู้เริ่มต้นไปจนถึงมีประสบการณ์มักจะไม่เข้าใจหรือทำผิด
ดังนั้นบทความนี้จึงทำการสรุปมาให้ เพื่อลดข้อผิดพลาด
รวมไปถึงย่นเวลาในการศึกษาอีกด้วย

เนื่องจากมี 50 เรื่อง เลยแบ่งออกเป็น blog ละ 10 เรื่องน่าจะดีกว่า
มาเริ่มกันเลย

เรื่องที่ 1 ปีกกาเปิด ( { ) ไม่สามารถอยู่ต่างบรรทัดได้

มิฉะนั้นก็จะ compile ไม่ผ่าน
แน่นอนว่า แตกต่างจากภาษาอื่น ๆ อย่างมาก
เนื่องจาก Go นั้นจะทำการเพิ่ม selicolon ไปท้ายบรรทัดให้แบบอัตโนมัติ
ดังนั้นถ้าเราใส่ { ต่างบรรทัดจึงพังนั่นเอง
ดังตัวอย่าง

เรื่องที่ 2 Unused variables

สำหรับภาษา Go นั้น ถ้าทำการประกาศตัวแปรใด ๆ ขึ้นมาแล้วใน function แต่ไม่ถูกใช้งาน
สิ่งที่เกิดขึ้นคือ จะ compile ไม่ผ่าน
แต่กฏก็มีข้อยกเว้นเช่นกัน
ยกตัวอย่างเช่น สามารถประกาศตัวแปรเป็น Global variable ไว้ได้
ถึงแม้จะไม่ถูกเรียกใช้งาน ก็ยัง compile ผ่าน
หรือ augment ของ function ต่าง ๆ ถ้าไม่ถูกเรียกใช้งาน ก็ยัง compile ผ่าน
มาดูตัวอย่างกัน

เรื่องที่ 3 Unused imports

อีกเรื่องที่สำคัญคือ ถ้าทำการ import library/module ต่าง ๆ เข้ามาใน code แล้วไม่ใช้งาน
ผลคือ compile ไม่ผ่านอีกแล้ว

แต่ถ้าต้องทำการ import แต่ไม่ได้ใช้งาน
ก็สามารถใช้ blank identifier (_) ได้ เพื่อให้ code ที่เขียน compile ผ่าน
มาดูตัวอย่างกัน

ในภาษา Go นั้นจะมีเครื่องมือชื่อว่า goimports
สำหรับช่วยลบ import ที่ไม่ถูกใช้งานออกไปให้
รวมทั้ง IDE และ Editor ก็มีการจัดการให้ด้วย

เรื่องท่ี 4 การประกาศตัวแปรแบบสั้นนั้น ใช้ได้ใน function เท่านั้น (:=)

เรื่องที่ 5 การประกาศตัวแปรซ้ำด้วยการประกาศแบบสั้น

โดยปกติแล้ว เราไม่สามารถประกาศตัวแปรแบบสั้น ๆ ในตัวแปรเดียวกันได้
แต่สามารถทำได้กับการประกาศตัวแปรมากกว่า 1 ตัว

เรื่องที่ 6 ไม่สามารถค่าให้ field value ของ struct ด้วยการใช้ := ได้

การใช้งาน temporary variable หรือการประกาศตัวแปรไว้ก่อนใช้งานนั้น
จะกำหนดค่าได้เฉพาะการกำหนดค่าแบบปกติคือ ใช้งานผ่าน = เท่านั้น

เรื่องที่ 7 ปัญหาที่อาจจะเกิดจาก Variable Shadowing

การประกาศตัวแปรแบบสั้นนั้น อำนวยความสะดวกต่อการเขียน program ในภาษา Go อย่างมาก
แต่ถ้าใช้งานไม่ถูกต้อง ก็อาจจะทำให้เกิดปัญหาได้ ถึงแม้จะ compile ผ่านก็ตาม
มาดูตัวอย่าง ซึ่งเขียนได้ง่ายมาก ๆ แต่เมื่อเกิดปัญหาจะหายากมาก ๆ

แต่นักพัฒนาสามารถใช้ go vet ในการหาบางปัญหาจาก shadow variable ได้
ค่า default ของ go vet นั้นไม่ได้เปิดความสามารถนี้
ดังนั้น การใช้งานต้องเพิ่ม -shadow flag เข้ามาดังนี้

เรื่องที่ 8 ไม่สามารถกำหนด nil ให้กับตัวแปรที่ประกาศแบบไม่กำหนดชนิดของตัวแปรได้

ในภาษา go นั้น nil คือ identifier สำหรับกำหนดเป็น zero-value ให้กับ
พวก interface, function, pointer, map, slice และ channel
แต่ถ้าทำการกำหนดให้กับตัวแปรที่ไม่กำหนดชนิดของตัวแปรแล้ว
สิ่งที่เกิดขึ้นมาคือ compile ไม่ผ่านนั่นเอง
เพราะว่าไม่สามารถคาดเดาชนิดของข้อมูลได้เลย

เรื่องที่ 9 การใช้งาน nil กับ Slice และ Map

สามารถเพิ่ม item ใหม่ที่เป็น nil ให้กับตัวแปรชนิด Slice ได้
แต่ไม่สามารถใช้ได้กับตัวแปรชนิด Map
ผลที่เกิดขึ้นคือ compile ผ่าน
แต่จะเกิด panic ตอน runtime ซึ่งน่ากลัวมาก ๆ ระวังกันด้วย

เรื่องที่ 10 Map capacity ไม่สามารถดึงค่าได้

ในการสร้างตัวแปรชนิด Map นั้น สามารถกำหนด capacity ได้
แต่ไม่สามารถดูค่า capacity ผ่าน function cap() ได้

Tags:,