go unicode เมื่อคิดถึง special characters

คำว่า special characters มันมีความไม่เท่ากันในแต่ละทีนะครับ อย่าลืมข้อนี้ บางทีแค่ $%& พวกนี้บางที่ก็เรียก special characters แล้ว มองบนหนึ่งทีแล้วไปต่อ เนื่องจาก go นั้นทำงานกับ UTF-8 เป็น default ไม่เหมือนกับ c ที่มอง string เป็น char 8bits มาต่อกันเลย

Continue reading →

ความสนุกของ go

ผมชอบภาษาโกมาก เหตุผลก็คือมันสนุก แต่การจะอธิบายว่ามันสนุกตรงไหนนี่ก็ยากมาก วันนี้เลยอยากจะพยายามอีกสักครั้งที่จะบอกว่ามันสนุกยังไง

Continue reading →

type alias

go version 1.9 ออกมาหลายวันละ นับตั้งแต่วันที่ release ก็เข้าไปอ่านเจอบรรทัดแรกๆเลยที่กล่าวถึง type alias ผมบอกเลยว่า `อะไรวะ` แต่ก็เก็บความสงสัยไว้เงียบๆ กะว่าเดี๋ยวต้องมีใครมาอธิบายแน่ๆ ว่าแต่เขาไปอธิบายกันตรงไหนนะ ไม่มาบอกกันมั่งเลย วันนี้ผมก็เลยไปลองอ่าน proposal เรื่องนี้ อ่านๆไป บอกตรงๆอีกที ก็ยังนึกไม่ค่อยจะออกว่าจะเอาไปใช้ตรงไหน ต้องขอโทษคนที่เข้ามาอ่านด้วยนะครับ พอดีผมไม่ค่อยฉลาด เน้นถึก เลยจะมาเล่าแค่เท่าที่พอจะอ่านเจอว่ามันมีดียังไงก็แล้วกันนะครับ

Continue reading →

tour.golang.org ภาษาไทย

เครื่องมือสำหรับผู้เริ่มต้นเรียนภาษาโก ที่ผมชอบมาก tour.golang.org ที่จริงมันอ่านง่าย และเข้าใจง่ายมากกว่าถ้าอ่านเป็นภาษาอังกฤษ พอมาแปลแล้วบางที การแปลมากไปก็จะทำให้อ่านแล้วงง มากกว่าเข้าใจ แต่ประเด็นมันอยู่ตรงที่อยากให้มีภาษาไทยอยู่บนนั้นมากกว่า https://go-tour-th.appspot.com หลังจากแปลเสร็จเพิ่งเมล์ไปแจ้งเขา ไม่รู้เมื่อไหร่จะได้เพิ่ม link ใน tour.golang.org รอลุ้นต่อไปครับ

Continue reading →

reload config file on the fly

บางครั้งเวลาที่เราเขียนโปรแกรมมาใช้งานแล้วมีไฟล์คอนฟิก เอาไว้เก็บพวก url  หรือค่าต่างๆที่ต้องการให้เปลี่ยนไปตาม environment หรือจะด้วยเหตุผลอะไรก็แล้วแต่ หลายๆครั้งที่เราเขียนการโหลดข้อมูลเป็นแบบ lazy load แล้วมันก็จะจำค่านั้นไว้จนกว่าโปรแกรมจะหยุด มีโจทย์มาอีกว่า ทำอย่างไรถึงจะ reload ค่าเหล่านั้นโดยไม่ต้อง stop/start โปรแกรมใหม่ วันนี้มีเทคนิคหนึ่งมานำเสนอครับ

Continue reading →

มาใช้ go routine แยกไปทำงาน แต่ต้องการ rollback เมื่อมีตัวใดตัวหนึ่ง error

มีโจทย์มาว่า เนื่องจากมีงานๆหนึ่ง ต้องทำหลาย task ในคราวเดียว เช่น อาจจะต้องการยิง api ไปที่โน่นที่นี่ ซึ่งแต่ละที่อาจจะใช้เวลาไม่มาก แต่ถ้าเราต้องรอให้เสร็จทีละตัว รวมๆกันอาจจะกินเวลานานจนระบบหน้าบ้าน timeout หนีไปเสียก่อน ยังไม่พอ หากแต่ละ service ที่ยิงไป ถ้าหากว่ามีตัวใดตัวหนึ่ง error ก็อยากจะ rollback งานทั้งหมดที่ทำเสร็จไปแล้วด้วยอีกต่างหาก ในเมื่อมีโจทย์มาแบบนี้ เราก็ต้องหาวิธีแก้ปัญหาซึ่งถ้าหากใครสนใจสามารถไปดู source code ได้ที่นี่ https://github.com/golians/rollback

Continue reading →

อยากใช้ go routine กับ channel แบบ ไม่ fix จำนวน

โจทย์ของผมคือ ปกติการใช้ go routine + channel แบบง่ายๆที่เริ่มทำใหม่ๆ จำเป็นจะต้องรู้จำนวนของ go routine ที่ชัดเจน เพื่อเวลาที่เราจะจับของใส่ chan หรือจะเอาออกมา จะได้ทำได้ถูกตัว และครบจำนวน ผมอยากให้มัน dynamic แบบที่ไปตัดสินใจว่าจะแตก go routine กี่ตัวกันใน runtime เลย จะทำอย่างไร จึงเกิด code ชุดนี้ขึ้นมา https://github.com/golians/queue Use case คือ ถ้ามีข้อมูลจำนวนมากเป็น slice/array แล้วต้องการแตก go routine ออกไปช่วยกันทำงาน โดยต้องไม่ทำงานซ้ำกัน และต้องทำให้ครบทุกงาน เมื่อเริ่มใช้ queue ด้วยคำสั่ง q := NewQueue(100) คือการระบุจำนวนของ record ที่ต้องการทำ จังหวะนี้ Queue จะสร้าง buffer channel จำนวน […]

Continue reading →

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 →