เรื่องพื้นฐานอย่าง Package ที่เรียบง่ายของ Go

 ผมขอเริ่มซีรี่ยส์แบ่งปันการเขียน Golang ให้สนุก โดยเริ่มจากเนื้อหาตามแนวของ A Tour of Go พร้อมใส่ใข่ และเครื่องปรุงให้อร่อย (สำหรับ A Tour of Go หากใครติดตั้ง Go เสร็จแล้วก็สามารถเปิดแบบ offline เล่นได้ด้วยคำสั่ง $go tool tour) Package เป็นสิ่งที่ช่วยจัดระเบียบโค้ดของเราได้อย่างน่าทึ่ง ระบบ Package ของ Go ถูกออกแบบมาเรียบง่ายและมีประสิทธิภาพ ซึ่งแรกๆ อาจต้องทำความเข้าใจธรรมชาติของมันบ้าง แต่หลังจากเริ่มเขียนเป็นและโปรแกรมใหญ่ขึ้น เราจะเริ่มเห็นชัดเจนขึ้นเรื่อยๆ ว่าทำไม Go จึงเขียนสนุก เพราะเริ่มจาก Package ที่จัดการง่ายนั่นเอง พื้นฐานอันดับแรก ทุกโปรแกรมของ Go ถูกสร้างขึ้นจากหลายๆ Package รวมกัน และโปรแกรมจะเริ่มต้นที่ Package main เสมอ (เว้นแต่เรากำลังจะเขียน Library) และจะมี function main() ตัวเดียวเป็นจุดเริ่มต้น โดยตัว […]

Continue reading →

ประเภทข้อมูล struct แบบไม่มีชื่อ

ใน Go เราสามารถสร้าง type ใหม่ด้วย struct ซึ่งเป็นการเอา type อื่นมาประกอบเป็นเป็น field ย่อยๆใน struct ตัวอย่าง type ใหม่เช่น type Employee struct { Firstname string Lastname string } เมื่อได้ type ใหม่ชื่อ Employee เราก็เอามันไปสร้างตัวแปรเก็บข้อมูล Employee ได้ปกติเหมือน type อื่น เช่น e := Employee { Firstname: “Weerasak”, Lastname: “Chongnguluam” } ทีนี้ ในบางกรณี เราไม่ได้ต้องการจะเอา type ที่มีโครงสร้าง field แบบนี้ ไปใช้ที่อื่น เราใช้ครั้งเดียว เช่นกรณีการแกะข้อมูลจาก Request Body […]

Continue reading →

สร้าง Array ที่มีขนาดตามค่าเริ่มต้น

ในภาษา Go นั้น Array คือ type ที่ต้องมีขนาดชัดเจน ส่วนการใช้งาน Array แบบเพิ่มลดขนาดได้นั้นแยกเป็น type อีกแบบคือ Slice ดังนั้นตอนเริ่มประกาศตัวแปร Array จริงๆแล้วต้องรู้ขนาดเช่น nums := [5]int{1, 2, 3, 4, 5} ถ้าเป็น Slice ก็คือไม่ต้องกำหนดขนาด nums := []int{1,2,3,4,5} ซึ่งปกติผมจะไม่สนใจขนาดก็ไปใช้ Slice ไปเลยตลอดเวลา ทีนี้ถ้าเกิดเราไม่ได้ต้องการที่จะเพิ่มลดขนาดของตัวแปรนี้เลย เราก็ควรที่จะสร้างเป็น Array แต่ถ้าต้องมีการแก้ไขจำนวนเริ่มต้นก็ต้องมานั่งแก้เลข 5 เป็น 10 เป็น 100 เอง แต่จริงๆแล้ว Go มีวิธีการสร้าง Array อีกแบบโดยไม่ต้องกำหนดค่าจำนวนสมาชิกเอง แต่จะดูค่าเริ่มต้นที่กำหนดให้ว่ามีขนาดเท่าไหร่ Array ก็มีขนาดเท่านั้น โดยใช้ … แทนค่าตัวเลข เช่น nums […]

Continue reading →

Go 1.5

ล่าสุด Go ปล่อยเวอร์ชั่น 1.5 ออกมาซึ่งยังคงรับรองว่ายังเข้ากันได้เวอร์ชั่น 1.x ก่อนหน้า และมีฟีเจอร์ที่เพิ่มขึ้นมาดังนี้ compiler เปลี่ยนจาก C เป็น Go ทั้งหมด การคอมไพล์จำเป็นจะต้องใช้ Go version 1.4 ในการคอมไพล์ Garbage Collector เปลี่ยนเป็นแบบ concurrent ช่วยให้ลด latency ของ GC ลง ค่าเริ่มต้นของ GOMAXPROCS เปลี่ยนเป็นตามจำนวน core ของ cpu จากเวอร์ชั่นก่อนๆ จะเป็น 1 รองรับ internal package ที่ช่วยให้ import ได้เพียงแพคเกจใกล้เคียงเท่านั้น เพิ่มคำสั่ง go รองรับ vendoring โดยเวอร์ชั่น 1.5 นี้ยังเป็นการทดลองอยู่รายละเอียดสามารถดูได้ที่นี้ เพิ่มคำสั่ง go tool trace ช่วยในการตามหาจุดบกพร่องของ program […]

Continue reading →

Empty Struct

สำหรับ Go type struct ไม่จำเป็นต้องมี field ก็ได้เช่น type Empty struct {} เมื่อไม่มี field หน่วยความจำที่ใช้สำหรับ struct ว่างๆแบบนี้ก็คือ 0 bytes นั่นเอง ลองใช้ฟังก์ชัน Sizeof จาก package unsafe เช็คดูได้ดังนี้ เมื่อเป็น struct แบบนี้ จะเอามาทำอะไรได้ ที่ผมเจอมาคือ เอามาใช้กับ channel ในกรณีที่ต้องการใช้ channel เป็นการควบคุมจังหวะการทำงานของ goroutine ไม่ได้ต้องการส่งข้อมูลจริงๆ หรือ เป็นการบอกว่า goroutine ทำงานเสร็จแล้ว เช่น ถ้าเราสร้าง array ของ empty struct เนื้อที่รวมที่ได้ก็เป็น 0 เช่นกัน ส่วน slice ของ empty struct […]

Continue reading →

Method Sets

จากที่ได้อธิบายเรื่อง Method Receiver ไปแล้วว่าแบบที่เป็น Pointer กับแบบที่เป็น Type ธรรมดา ต่างกันอย่างไร วันนี้จะมาดูว่าเวลาที่เรากำหนดค่าของ Type หรือ Pointer ของ Type ให้กับตัวแปรแบบ Interface นั้น Interface จะรู้ได้อย่างไรว่า Type นี้ implement interface นี้หรือไม่ สำหรับ Go นั้นจะดูว่า Type นั้นมี Method Sets ตรงกับที่ระบุไว้ใน Interface ครบหรือไม่นั่นเอง ตัวอย่างเช่น มี interface ดังนี้ interface นี้มีสอง Methods คือ Read กับ Write ดังนั้นเราจึงรู้ว่า Type ที่จะกำหนดค่าให้ interface นี้ได้ต้องมีสอง Methods นี้ ทีนี้เรารู้ว่า Method […]

Continue reading →

Method Receiver

ถ้ามองในมุม OOP Method แสดงถึง Behavior ของ Object กว่า Object นั้นกระทำ action อะไรได้บ้าง สำหรับ Method ของ Go ก็เช่นกัน การกำหนด receiver ก็เพื่อบอกว่า type ไหนจะมีหน้าที่ทำงาน method นี้ ทีนี้ การทำหนด type ของ receiver เราสามารถกำหนดได้ทั้ง Type ธรรมดา และ pointer ของ Type นั้นๆ เรามาดูว่ามันแตกต่างกันยังไง สมมุติเรามี type Account ดังนี้ ในการสร้าง method มีหลักง่ายๆคือ ถ้าเราต้องการเปลี่ยนแปลงค่าของ Type ที่เป็น receiver เราจะเลือกใช้ pointer เป็น receiver ถ้าเราไม่ต้องการ เราจะเลือกใช้เป็น […]

Continue reading →

Go ไม่มี class และ object แต่ทำไมถึงมี Method และ Interface

The obvious example is the way interfaces give us the composition of components. It doesn’t matter what that thing is, if it implements method M I can just drop it in here. – Rob Pike ( Less is exponentially more )   Go เป็น procedure language ที่เราสร้าง Type ใหม่เองได้ และ สร้าง method ให้เจาะจงแต่ละ Type ได้ แบบที่เคยเขียนไว้คราวก่อน […]

Continue reading →

เอา playground มา embed ง่ายๆ บน blog ของเรา

นั่งนึกหาวิธีอยู่นานว่าจะเอา playground ของ golang มาลงบน blog เพื่อให้ง่ายต่อผู้อ่านในการทดลองแก้ไขและรันได้ยังไงแล้วก็ปิ้งขึ้นมาได้ว่าจริงๆ แล้วเราใช้ iframe ก็ได้นี่หน่า ด้วยโค้ดดังนี้ จะได้ให้ได้ผลลัพธ์ด้านล่าง

Continue reading →

Go ไม่มี class และ object แต่ทำไมถึงมี Method

Go ไม่มี class แต่ทำไมถึงมี Method ก่อนจะว่าด้วยเรื่อง Method ไปดูเรื่อง Function กันก่อน Function ของ Go ก็แบบเดียวกับภาษาอื่นๆอย่างเช่น C นั่นล่ะครับ ตัวอย่างเช่น Function ก็สามารถรับค่า และ return ค่ากลับได้เช่น ต่อไปถ้าผมสร้าง type struct ขึ้นมาสักตัวเช่นผมไปลอก class Bicycle จาก Java Tutorial http://docs.oracle.com/javase/tutorial/java/javaOO/classes.html มาทำเป็น type Bicycle struct ดังนี้ ทีนี้ถ้า Go เป็นแค่ภาษาที่มี Function เราอยากสร้าง Function ที่เพิ่ม และ ลด speed ของข้อมูลแบบ Bicycle ขึ้นมา เราสามารถสร้าง function ได้ประมาณนี้ นั่นคือเราต้องส่งค่า pointer […]

Continue reading →