จากบทความเรื่อง
50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs
ทำการสรุปเรื่องต่าง ๆ ที่น่าสนใจสำหรับการพัฒนาระบบด้วยภาษา Go
ซึ่งเป็นสิ่งที่นักพัฒนาทั้งผู้เริ่มต้นไปจนถึงมีประสบการณ์มักจะไม่เข้าใจหรือทำผิด
ดังนั้นบทความนี้จึงทำการสรุปมาให้ เพื่อลดข้อผิดพลาด
รวมไปถึงย่นเวลาในการศึกษาอีกด้วย
เนื่องจากมี 50 เรื่อง เลยแบ่งออกเป็น blog ละ 10 เรื่องน่าจะดีกว่า
มาเริ่มกันเลย
เรื่องที่ 1 ปีกกาเปิด ( { ) ไม่สามารถอยู่ต่างบรรทัดได้
มิฉะนั้นก็จะ compile ไม่ผ่าน
แน่นอนว่า แตกต่างจากภาษาอื่น ๆ อย่างมาก
เนื่องจาก Go นั้นจะทำการเพิ่ม selicolon ไปท้ายบรรทัดให้แบบอัตโนมัติ
ดังนั้นถ้าเราใส่ { ต่างบรรทัดจึงพังนั่นเอง
ดังตัวอย่าง
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="1.go"]
เรื่องที่ 2 Unused variables
สำหรับภาษา Go นั้น ถ้าทำการประกาศตัวแปรใด ๆ ขึ้นมาแล้วใน function แต่ไม่ถูกใช้งาน
สิ่งที่เกิดขึ้นคือ จะ compile ไม่ผ่าน
แต่กฏก็มีข้อยกเว้นเช่นกัน
ยกตัวอย่างเช่น สามารถประกาศตัวแปรเป็น Global variable ไว้ได้
ถึงแม้จะไม่ถูกเรียกใช้งาน ก็ยัง compile ผ่าน
หรือ augment ของ function ต่าง ๆ ถ้าไม่ถูกเรียกใช้งาน ก็ยัง compile ผ่าน
มาดูตัวอย่างกัน
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="2.go"]
เรื่องที่ 3 Unused imports
อีกเรื่องที่สำคัญคือ ถ้าทำการ import library/module ต่าง ๆ เข้ามาใน code แล้วไม่ใช้งาน
ผลคือ compile ไม่ผ่านอีกแล้ว
แต่ถ้าต้องทำการ import แต่ไม่ได้ใช้งาน
ก็สามารถใช้ blank identifier (_) ได้ เพื่อให้ code ที่เขียน compile ผ่าน
มาดูตัวอย่างกัน
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="3.go"]
ในภาษา Go นั้นจะมีเครื่องมือชื่อว่า
goimports
สำหรับช่วยลบ import ที่ไม่ถูกใช้งานออกไปให้
รวมทั้ง IDE และ Editor ก็มีการจัดการให้ด้วย
เรื่องท่ี 4 การประกาศตัวแปรแบบสั้นนั้น ใช้ได้ใน function เท่านั้น (:=)
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="4.go"]
เรื่องที่ 5 การประกาศตัวแปรซ้ำด้วยการประกาศแบบสั้น
โดยปกติแล้ว เราไม่สามารถประกาศตัวแปรแบบสั้น ๆ ในตัวแปรเดียวกันได้
แต่สามารถทำได้กับการประกาศตัวแปรมากกว่า 1 ตัว
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="5.go"]
เรื่องที่ 6 ไม่สามารถค่าให้ field value ของ struct ด้วยการใช้ := ได้
การใช้งาน temporary variable หรือการประกาศตัวแปรไว้ก่อนใช้งานนั้น
จะกำหนดค่าได้เฉพาะการกำหนดค่าแบบปกติคือ ใช้งานผ่าน = เท่านั้น
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="6.go"]
เรื่องที่ 7 ปัญหาที่อาจจะเกิดจาก Variable Shadowing
การประกาศตัวแปรแบบสั้นนั้น อำนวยความสะดวกต่อการเขียน program ในภาษา Go อย่างมาก
แต่ถ้าใช้งานไม่ถูกต้อง ก็อาจจะทำให้เกิดปัญหาได้ ถึงแม้จะ compile ผ่านก็ตาม
มาดูตัวอย่าง ซึ่งเขียนได้ง่ายมาก ๆ แต่เมื่อเกิดปัญหาจะหายากมาก ๆ
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="7.go"]
แต่นักพัฒนาสามารถใช้ go vet ในการหาบางปัญหาจาก shadow variable ได้
ค่า default ของ go vet นั้นไม่ได้เปิดความสามารถนี้
ดังนั้น การใช้งานต้องเพิ่ม -shadow flag เข้ามาดังนี้
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="7.txt"]
เรื่องที่ 8 ไม่สามารถกำหนด nil ให้กับตัวแปรที่ประกาศแบบไม่กำหนดชนิดของตัวแปรได้
ในภาษา go นั้น nil คือ identifier สำหรับกำหนดเป็น zero-value ให้กับ
พวก interface, function, pointer, map, slice และ channel
แต่ถ้าทำการกำหนดให้กับตัวแปรที่ไม่กำหนดชนิดของตัวแปรแล้ว
สิ่งที่เกิดขึ้นมาคือ compile ไม่ผ่านนั่นเอง
เพราะว่าไม่สามารถคาดเดาชนิดของข้อมูลได้เลย
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="8.go"]
เรื่องที่ 9 การใช้งาน nil กับ Slice และ Map
สามารถเพิ่ม item ใหม่ที่เป็น nil ให้กับตัวแปรชนิด Slice ได้
แต่ไม่สามารถใช้ได้กับตัวแปรชนิด Map
ผลที่เกิดขึ้นคือ compile ผ่าน
แต่จะเกิด panic ตอน runtime ซึ่งน่ากลัวมาก ๆ ระวังกันด้วย
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="9.go"]
เรื่องที่ 10 Map capacity ไม่สามารถดึงค่าได้
ในการสร้างตัวแปรชนิด Map นั้น สามารถกำหนด capacity ได้
แต่ไม่สามารถดูค่า capacity ผ่าน function cap() ได้
[gist id="8bdf9e24d4efa14e2e95d793e4074c5f" file="10.go"]