ข้ามไปที่เนื้อหาหลัก

ภาษา Go


ประเดิม post แรกสำหรับ blog กันด้วย ภาษาโปรแกรมยุคใหม่ ที่กำลังได้รับความนิยมมากขึ้นเรื่อย ๆ ในขณะนี้ นั้นก็คือเจ้า ภาษา Go นั่นเอง หรือเรียกกันอีกชื่อว่า golang ส่วนตัวผมเรียกมันว่า golang มากกว่า go เฉย ๆ เพราะเวลาพูดมันรู้สึกงง ๆ มันคือคำว่า "ไป" หรือชื่อภาษาโปรแกรมกันแน่ และอีกอย่างคือเวลาเรา google หาคำว่า go มันไม่ค่อยเจอ แต่พอใช้คำว่า golang กลับเจอมากกว่าซะงั้น

เหตุที่ผมต้องมาทำความรู้จักกับ golang ก็มาจากความต้องการที่จะเขียนโปรแกรมฝั่ง server เพื่อรองรับจำนวนผู้ใช้งานมากหรือที่เรียกกันว่า concurrent ตอนแรกก็เลือกระหว่าง nodejs กับ golang แต่สุดท้ายมาลงตัวที่ golang ด้วยเหตุผล 2 อย่างคือ
  1. Go lang มัน compile ได้ ถ้าทำบน windows ก็ได้ file .exe ออกมาเลย หรือถ้าเป็น unix ก็ได้ execute binary มากันเลยทีเดียว ก๊อบไป file เดียวรันได้เลย ไม่ต้องลง runtime อะไรอีกแล้ว และข้อดีอีกอย่างของการ compile คือไม่ต้องกังวลว่าใครจะมาขโมยไปเวลาไปติดตั้งไว้บนเครื่องของลูกค้า
  2. โครงสร้างและวิธีคิดมันคล้ายกับภาษา C ที่เป็นภาษาที่ผมเองถนัดมากสุด ตอนได้เห็นโครงสร้างภาษามันครั้งแรกก็รู้สึกเหมือนว่าได้รู้จักกับเพื่อนเก่า ที่ไปทำศัลยกรรมแปลงโฉมมาใหม่ สวยกว่าเก่าแถมยังฉลาดกว่าเก่าอีกด้วย
Go เป็นภาษายุคใหม่ที่รวมความสามารถหลาย ๆ อย่างไว้เกือบหมด แต่ก็มีบางอย่างที่ด้อยกว่า เท่าที่ได้ลอง ผมขอสรุปสั้น ๆ ตามหัวข้อด้านล่าง ข้อสรุปทั้งหมดเกิดจากการใช้เวลาลองเขียนแค่ 2 อาทิตย์อาจไม่สามารถอธิบายในรายละเอียดในบางหัวข้อ

รองรับจำนวนผู้ใช้งานพร้อมกันได้จำนวนมาก

หรืออีกความหมายก็คือสับรางเก่งนั่นเอง Go ได้ถูกออกแบบมาโดยชูเรื่องนี้เป็นหัวใจหลัก เรียกมันว่า go routine เป็นการสร้าง flow การทำงานโดยการสร้าง go routine ทิ้งไว้แล้วทำงานหลักต่อไปเลย เมื่องานหลักไม่ต้องทำงานก็จะสลับกลับมาทำงานใน go routine จนกระทั่ง go routine หยุดรอการทำงานอื่น ๆ ก็จะสลับกลับมาทำงานในโปรแกรมหลัก ฟังดูอาจเข้าใจยากไปซักนิด จะให้เข้าใจง่าย ลองเปรียบเทียบกับชีวิตจริง สมมุติถ้าเรามีแฟน 2 คน แล้วเกิดเหตุต้องไปเที่ยวในวันเดียวกัน คนนึงไปดูหนัง อีกคนไปกินข้าว เราก็จะสลับรางคล้าย ๆ แบบนี้ 1. ให้แฟน 1 เข้าคิวซื้อตั๋วหนัง 2. ระหว่างที่แฟน 1 ซื้อตั๋ว เราก็ว่างมาโทรนัดแฟน 2 ให้ไปรอที่ร้านอาหาร 3. เข้าโรงดูหนังกับแฟน 1 4. ทำทีออกมาเข้าห้องน้ำ แล้วแว๊ปไปที่ร้านอาหารกับแฟน 2 แล้วสั่งอาหาร 5. ระหว่างรออาหาร ทำทีออกมาเข้าห้องน้ำ (อีกแล้ว) แล้วกับไปเข้าโรงหนังดูตอนจบกับ แฟน 1 6. หนังจบแยกจาก แฟน 1 วิ่งกับไปกินข้าวต่อกับ แฟน 2 7. แยกจากแฟน 2 Go routine ก็ทำงานในลักษณะเดียวกันคือทำงานงานหนึ่งเมื่อถึงสถานะที่ต้องรอ ก็จะสลับไปทำงานอื่น แตกต่างจากการแตก thread ที่จะสลับทำงานตลอดเวลา ถ้าเราใช้ multithread กับเหตุการณ์เดียวกัน เราคงต้องขอเข้าห้องน้ำทุก ๆ นาที ได้วิ่งกันหอบแฮกแน่นอน :)

Compile เร็ว

อีกเรื่องที่ประทับใจมาก ๆ สำหรับภาษานี้คือความเร็วในการ compile ต้องถือว่าเร็วที่สุดที่เคยใช้มา ขนาดผม compile บนเครื่อง linux ที่ใช้เป็น NAS server ที่บ้าน ที่ใช้ CPU ตัวเล็ก ๆ อย่าง AMD A4 ก็ยังใช้เวลาไม่ถึงวินาที ไม่ว่าโปรแกรมจะใหญ่เล็กแค่ไหนก็ยังเร็วมาก ๆ อันนี้ประทับใจสุด ๆ ไปเลย

Go Playground

มีสนามเด็กเล่นให้ลองเล่นเวลาจะต้องการลองเขียนโปรแกรมเล็ก ๆ ก็สามารถเล่นลองรันได้ทันทีไม่จำเป็นต้องติดตั้งโปแกรมให้ยุ่งยากเพียงแค่เปิด browser เข้าไปที่ [play.golang.org](http://play.golang.org) ก็พร้อมใช้งานแล้ว หรือจะลองเขียนเองแล้วให้คนอื่นเข้าไปดูก็ยังได้ ลองคลิ๊ก Go Playground เข้าไปดูตัวอย่างที่ผมลองวางทิ้งไว้

อื่น ๆ

* เป็นภาษาที่มี Garbage collector เวลาจองตัวแปลแล้วไม่จำเป็นต้องคืนเอง จะมีคนมาเก็บกวาดให้ ถือเป็นข้อดีอีกข้อนึง แต่ถ้าใช้ไม่เป็นก็อาจจะสร้างภาระให้คนเก็บกวาดได้เหมือนกัน * ไม่เป็น OOP (Object-Oriented Programming) สาวก gang of four ต้องทำใจกันหน่อย ผมเดาว่าการมาของ go routine ซึ่งเป็น flow การทำงานพิเศษ และการออกลูกออกหลานใน OOP ก็เป็น flow การทำงานที่พิเศษเช่นกัน ประมาณว่าเสือสองตัวอยู่ถ้ำเดียวกันไม่ได้ เลยต้องตัดความสามารถทางด้าน OOP ออกไป แต่อย่างไรก็ตาม golang ก็สามารถสร้าง mothod ผูกกับ structure และยังมี interface ให้ใช้เช่นเดียวกับ OOP เพียงแต่ไม่มีการ inheritance หรือการออกลูกออกหลานเท่านั้น * ไม่มี error handling ต้องจัดการ error เอง ไม่มี error handling ให้ใช้นะจ๊ะ

สรุป

Go หรือ golang เป็นภาษาที่ดีมาก ๆ ในการพัฒนา server application ที่ต้องการรองรับจำนวนผู้ใช้งานจำนวนมากเช่น mobile application หรือ web server ด้วยข้อดีของ go routing ใครที่เขียน server ทั้งสองประเภทลองเล่นดูครับ แล้วจะรับรู้ถึงพลัง...

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ดาต้าเซ็นเตอร์แนวคิดใหม่

ดาต้าเซ็นเตอร์ใหม่ ใช้แนวคิดล่าสุดในการทำความเย็นให้เครื่อง servers แทนที่จะทำความเย็นทั้งห้อง เป็นการใช้ไฟฟ้าอย่างคุ้มค่า และมีความมั่นคงระดับ tier 3+ ระบบทั้งหมดยกขึ้นมาอยู่เหนือ rack ให้เห็นกันชัดๆ แทนที่จะซ่อนไว้ใต้พื้น ดูแลรักษาง่าย balance phases ไฟฟ้าสะดวก ปรับควบคุม air flow ได้ตามสั่ง ระบบ monitoring สมบูรณ์แบบ ทั้งไฟฟ้า อุณหภูมิ ความชื้น มาพร้อมระบบดับเพลิงที่ปลอดภัยไม่เป็นพิษกับคนและสิ่งแวดล้อม 

ตามหาของหาย โปรแกรม tetris 3 คน

ตามหาของหาย โปรแกรม tetris 3 คน เล่นบนเครื่องเดียว ที่เขียนตอนสมัยเรียน ผมทำหายไปนานแล้วทั้ง source code และ exe file แต่ทราบว่ารุ่นน้อง ๆ ยังเล่นต่อกันอีกหลายปี ใครมี file อยู่รบกวนขอด้วยครับ จะจัดฉลองใหญ่สมนาคุณ โปรแกรมนี้ดูเหมือนเป็นเกมส์ธรรมดา แต่สำหรับเครื่องในสมัยนั้น รัน os เป็น dos แต่ต้องรัน tetris สามเกมส์ในเครื่องเดียวกันแถมยัง มี background music และ sound effect ออกลำโพง digital ต้องใช้เทคนิค event driven กันเลยทีเดียว ไม่น่าเชื่อว่าเทคนิคโบราณจะกลับตอบโจทย์ concurrency สำหรับ server โปรแกรม หลายตัว เช่น nginx หรือ app ที่พัฒนาด้วย nodejs

Push หรือ pull สำหรับ mobile application

ช่วงนี้เห็นมี mobile application ใหม่ ๆ เกิดขึ้น และมีความต้องการการทำงานแบบ real-time ขึ้นเช่นการ update transaction บนหน้าจอ app ทันที ที่ transaction สำเร็จ model ที่ใช้กันมี 3 แบบหลัก ๆ ตามในรูป จากประสประสบการณ์ผม push-pull เป็นแบบที่เหมาะสมกับงานแบบนี้ที่สุด  แบบ polling ช้าและเกิดภาระที่ server สูง ส่วน push ต้องจัดการกับความไม่เสถียรของ mobile network ซึ่งถ้าไม่ได้ออกแบบรอบรับไว้ตั้งแต่ต้นรับรองว่างานหยาบ