Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

[Part 1] สรุป 50 เรื่องสำหรับผู้เริ่มต้นพัฒนาระบบด้วยภาษา Go

$
0
0

จากบทความเรื่อง 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"]

Viewing all articles
Browse latest Browse all 1997

Trending Articles