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 →

[โคตรนูบ]เกรียนรู้การใช้ตัวแปรของโกด้วยโกคู

dragonball_goku_002_52065

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

Continue reading →

go run แล้วทำไมช้า?

slow-snail-1409322

บางครั้งที่เรา import Library เข้ามาบางตัวเช่น github.com/mattn/go-sqlite3  หรือกระทั่ง github.com/lib/pq พอสั่ง go run … หรือ go test แล้วปรากฏว่าทำงานช้าผิดปกติ อาจใช้เวลา30-50 วินาที กว่าจะรันโปรแกรมเราได้ ทั้งๆที่ปกติโกขึ้นชื่อเรื่องเร็วจี๋มิใช่ฤา แปลกใจปนหงุดหงิดนั่งสงสัยอยู่นาน

Continue reading →