ประเภทข้อมูล struct แบบไม่มีชื่อ

ใน Go เราสามารถสร้าง type ใหม่ด้วย struct ซึ่งเป็นการเอา type อื่นมาประกอบเป็นเป็น field ย่อยๆใน struct ตัวอย่าง type ใหม่เช่น type Employee struct { Firstname string Lastname string } เมื่อได้ type ใหม่ชื่อ Employee เราก็เอามันไปสร้างตัวแปรเก็บข้อมูล Employee ได้ปกติเหมือน type อื่น เช่น e := Employee { Firstname: “Weerasak”, Lastname: “Chongnguluam” } ทีนี้ ในบางกรณี เราไม่ได้ต้องการจะเอา type ที่มีโครงสร้าง field แบบนี้ ไปใช้ที่อื่น เราใช้ครั้งเดียว เช่นกรณีการแกะข้อมูลจาก Request Body […]

Continue reading →

สร้าง Array ที่มีขนาดตามค่าเริ่มต้น

ในภาษา Go นั้น Array คือ type ที่ต้องมีขนาดชัดเจน ส่วนการใช้งาน Array แบบเพิ่มลดขนาดได้นั้นแยกเป็น type อีกแบบคือ Slice ดังนั้นตอนเริ่มประกาศตัวแปร Array จริงๆแล้วต้องรู้ขนาดเช่น nums := [5]int{1, 2, 3, 4, 5} ถ้าเป็น Slice ก็คือไม่ต้องกำหนดขนาด nums := []int{1,2,3,4,5} ซึ่งปกติผมจะไม่สนใจขนาดก็ไปใช้ Slice ไปเลยตลอดเวลา ทีนี้ถ้าเกิดเราไม่ได้ต้องการที่จะเพิ่มลดขนาดของตัวแปรนี้เลย เราก็ควรที่จะสร้างเป็น Array แต่ถ้าต้องมีการแก้ไขจำนวนเริ่มต้นก็ต้องมานั่งแก้เลข 5 เป็น 10 เป็น 100 เอง แต่จริงๆแล้ว Go มีวิธีการสร้าง Array อีกแบบโดยไม่ต้องกำหนดค่าจำนวนสมาชิกเอง แต่จะดูค่าเริ่มต้นที่กำหนดให้ว่ามีขนาดเท่าไหร่ Array ก็มีขนาดเท่านั้น โดยใช้ … แทนค่าตัวเลข เช่น nums […]

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 →

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 →