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 →

Basic goroutine and channel

วันนี้มาเริ่มท่าง่ายๆกับ goroutine และ channel กันก่อน Goroutine เป็นวิธีการเรียก function ให้ทำงานโดยแยกออกจากลำดับการทำงานของ function ที่ไปเรียกใช้งาน ตัวอย่างเช่น เราอยากสร้างฟังก์ชันที่ให้นับทุกๆ 1 วินาที เราจะเขียนโค้ดได้ดังนี้ ลองเล่นผ่าน Go Playground ได้ที่นี่ http://play.golang.org/p/jpM6QcJaKq จะเห็นว่า เราต้องรอการนับแต่ละครั้งจบก่อน ถึงจะนับครั้งต่อไปได้ ทีนี้ถ้าเราต้องการมีตัวนับสองตัวล่ะ ให้ตัวนึงนับทุก 1 วินาที อีกตัวนับทุก 5 วินาที จะเห็นว่าเราไม่สามารถเรียก function สองตัวนี้พร้อมกันได้ วิธีการที่จะทำได้สำหรับ Golang คือเรียกฟังก์ชันให้ทำงานเป็น Goroutine เพื่อให้แยกทำงานอิสระจาก flow การทำงานหลัก วิธีการเรียกฟังก์ชันให้ทำงานแบบ Goroutine คือใช้ keyword ว่า go ข้างหน้าการเรียกฟังก์ชัน เช่น แต่ถ้ารันโค้ดนี้จะพบว่าไม่แสดงอะไรออกมาเลย เพราะอย่างที่บอกไปว่าเมื่อเรียกแบบ Goroutine มันจะแยกอิสระ ทำให้ ณ […]

Continue reading →