test โดย ignore vendor

อย่างที่ทราบว่าตั้งแต่ go version 1.5 เราสามารถเอา lib dependencies ทั้งหลายมาใส่ไว้ใน directory ที่ชื่อ vendor ได้ โดยที่โค้ดของเราจะมองหา package ที่อยู่ใน vendor นี้ก่อนเสมอ ทำให้เราสามารถ แช่แข็งเครื่องมือของเราเอาไว้ได้ โดยไม่ต้อง go get มาใหม่ ซึ่งจะลดผลกระทบจาก version ที่เปลี่ยนไปได้ แต่หลายคนที่เริ่มใช้ vendor ก็จะพบปัญหาบางอย่าง เช่นการเทส เพราะมีไม่น้อยที่เวลารันเทส จะสั่งประมาณนี้ go test ./… สำหรับมือใหม่ ./… หมายถึงทุกๆ directory จาก จุดที่รันคำสั่ง เช่นเมื่อเราอยู่ที่  /home/pallat/workspace/gopath/src/mywork แล้วเราสั่งว่า  go test ./… หมายความว่า ให้รันเทสที่ /home/pallat/workspace/gopath/src/mywork และ directory ในนี้ทั้งหมดด้วย ทีนี้ เราก็ไม่อยากให้มันเทสของใน vendor […]

Continue reading →

วิธี type cast ของ Golang

ในภาษา C และ Java เราสามารถทำการ type casting หรือการแปลง type ง่ายๆได้โดยวิธีนี้ เช่น int a = (int)10.1; char b = (char) 97; จะเห็นว่า เอาชื่อ type ไว้ภายในวงเล็บ แล้วเอาไปไว้ด้านหน้าค่าที่ต้องการแปลง แต่สำหรับ Golang เวลาทำ type cast จะต่างออกไปคือ ใช้ชื่อ type แต่ว่าวงเล็บแทนที่จะครอบ type แต่วงเล็บจะครอบค่าที่ต้องการแปลงเอง เหมือนกับการเรียกฟังก์ชันโดยชื่อ type เป็นฟังก์ชัน นั่นเอง ตัวอย่างเช่น i := int(‘c’) fmt.Println(i) type cast จะใช้บ่อยๆในกรณีที่เราทำการสร้าง type ใหม่ของเราเอง และต้องการแปลงไปแปลงกลับระหว่าง type พื้นฐานที่เราเอามานิยาย type กับ […]

Continue reading →

ฟังก์ชันครอบฟังก์ชัน

บอกตรงๆ ผมตั้งชื่อบทความนี้ไม่ถูกเลยทีเดียว เราลองมาดูกันครับ เริ่มต้นจากความต้องการก่อนนะครับว่าผมต้องการอะไร สิ่งที่ผมต้องการคือ http handler ตัวหนึ่ง แต่เนื่องจากเมื่อวันเวลาผ่านไป ผมก็เริ่มมี handler เพิ่มขึ้นเรื่อยๆ และมีงานหลายๆอย่างที่ทำซ้ำๆเกิดขึ้น เช่นเขียน log เป็นต้น ทำให้ผมเริ่มคิดอยากจะห่อเจ้า handler ด้วยฟังก์ชันที่จะมาช่วยทำงานซ้ำๆแบบปิดหัวปิดท้ายได้ จึงเกิดบทความนี้ครับ เพื่อไม่ให้เสียเวลา มาดูโค้ดก่อนเลยดีกว่า

Continue reading →

​Go 1.4 Released

เมื่อวันพุธที่ 10 ธันวาคม Go ได้ปล่อยเวอร์ชั่น 1.4 ออกมา ซึ่งเวอร์ชั่นนี้มีการเปลี่ยนแปลงหลักๆ มีอะไรบ้างเรามาดูกัน compiler ของ Go ที่เขียนด้วย C จะถูก translate มาเป็น Go for-range loops ยอมให้ใช้ “for range x {” สำหรับการวนลูบแบบไม่ต้องการค่าได้แล้ว เปลี่ยน version control จาก Mercurial ไปเป็น Git และ source code จะย้ายไปอยู่ที่ https://go.googlesource.com/ ส่วน issues tracker จะย้ายไปอยู่ที่ golang/go ของ GitHub support Android โดย package สำหรับ Android จะอยู่ที่ golang.org/x/mobile support NaCl บน ARM เพิ่ม […]

Continue reading →

Interface ใน Go

ก่อนจะไปพูดถึงเรือง interface เรามาดูก่อนว่าถ้าผมต้องการเขียนโปรแกรมให้นับเลขตามลำดับใน index ของ array ว่าถ้า index นั้นสามารถหารลงตัวด้วย 3 ให้นับ Fizz แต่ถ้าหารด้วย 5 ลงตัวให้นับ Buzz เราก็สามารถเขียนโปรแกรมง่ายๆได้ดังนี้ (ลองใน Go Playfround)

Continue reading →

ทดสอบ http ด้วย http recorder

จากบทความ สร้าง webservice ด้วย net/http คราวนี้คนที่ทำ TDD หรือ automated test จะตั้งคำถามว่า “แล้วเราทำทดสอบมันยังไง” Go มีชุดทดสอบสองทางเลือกครับ ทดสอบด้วย http response recorder ทดสอบด้วยการตั้ง server จำลองขึ้นมา ในบทความนี้เราจะมาลองทดสอบด้วย http response recorder กัน

Continue reading →

สร้าง web service ง่ายๆ ด้วย net/http

ส่วนใหญ่มักจะมีคนมาถามเรื่อยเลยว่า Go นั้นเขียน web ได้หรือไม่ เลยเป็นการดีจะมาเล่าให้ฟัง Go มี built-in library ชื่อ net/http เอาไว้จัดการเรื่องของ http ไม่ว่าจะเป็นฝั่ง client หรือ server ก็ตาม เราสามารถสร้าง http server ได้อย่างง่ายๆ เราจะมาลองทำ web service ง่ายๆ ซักตัวโดย request เป็น GET /api/hello response ที่ได้กลับมาเป็น {“text”: “hello”}

Continue reading →

เขียนเทสภาษาโก

เริ่มเขียนเทสแบบง่ายที่สุดกันก่อน เพื่อสร้างความมั่นใจกันดีกว่า โดยเริ่มจากสร้างโฟล์เดอร์ src/first ใน gopath แล้วสร้างไฟล์ชื่อ hi_test.go แล้วพิมพ์แบบนี้ลงไป

Continue reading →