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 →

การทดสอบแบบ Example

package testing ของ Go มีการทดทอบ 3 แบบคือแบบที่ขึ้นต้นด้วย Test ขึ้นต้นด้วย Benchmark และ ขึ้นต้นด้วย Example วันนี้จะมาดูแบบ Example กัน การทดสอบแบบ Example จะเป็นการเอาสิ่งที่ถูกปริ้นออกไปที่ standard output ไปเทียบกับ text ที่เราจะทดสอบที่ถูกเตรียมโดยใช้ comment ที่ขึ้นต้นด้วย // Output: ตัวอย่างเช่น เป็นโค้ดที่ผมใช้ทดสอบ function From ที่ทำการจัด format ให้กับ json text เวลาเรารัน go test ก็จะเอาผลที่เกิดจากการ fmt.Println(formated) จะเอาไปเทียบกับสิ่งที่อยู่หลัง // Output: โดยตามคู่มือบอกว่า จะตัดช่องว่างหัวท้ายให้แล้วด้วยเวลาเปรียบเทียบ เท่านี้ก็ได้วิธีทดสอบง่ายๆกรณีเรามี example เป็น text ที่ชัดเจนแล้วล่ะครับ

Continue reading →

ใช้ Golang กับ MongoDB ผ่าน mgo

วันนี้มาดูวิธีใช้งานฐานข้อมูล MongoDB ด้วย Golang ผ่านทาง package mgo กันครับ เริ่มแรกติดตั้ง package mgo กันก่อนเลยโดยใช้ $ go get install gopkg.in/mgo.v2 ดูตัวอย่างแรกกันก่อนเลย จะลอง insert document ไปที่ db ที่ชื่อ  test และ collection student ให้มีข้อมูล {name:”Weerasak”} จะเห็นว่าหลักๆคือทำการติดต่อกับ mongo โดยการสร้าง session ขึ้นมาก่อนด้วยการใช้ mgo.Dial หลังจากนั้นถ้าไม่มี error อะไรเกิดขึ้น เราจะสั่ง defer session.Close() เอาไว้ก่อนเลยเพื่อให้ไม่ลืมปิด session ต่อไปทำการเลือก db และ collection ที่เราจะทำการ insert โดยเรียกใช้ method DB ของ session […]

Continue reading →

Multiple return values

Go สามารถเขียน Function ให้สามารถ return หลายค่าออกมาได้ ซึ่งถ้าดูจาก standard package จะเห็นว่าส่วนใหญ่ใช้ไปกับการส่งค่า error กลับออกมาเป็นค่าที่สองของ Function ซะเยอะ มีบ้างบาง Function ที่ส่งกลับ 3 ค่า แต่น้อยมาก ตัวอย่างเช่น Function os.Open ใน package os ที่เอาไว้เปิดไฟล์ถูกประกาศไว้ดังนี้ func Open(name string) (file *File, err error) เวลาใช้งาน ถ้าเราต้องการรับค่าจาก Function Open มาเก็บไว้ ด้านซ้ายของเครื่องหมาย = หรือ := ก็ต้องกำหนดตัวแปรสองตัวตามลำดับไว้สำหรับเก็บ file และ err เช่น f, err := os.Open(“test.txt”) ทีนี้เราลองสร้างของเราเองสัก Function เช่นเราต้องการสร้าง […]

Continue reading →