Interface ในภาษา Go นั้นเป็นความสามารถที่แจ่มมาก
แต่มันกลับสร้างความสร้างความสับสน
ให้กับผู้เริ่มต้นศึกษาเช่นตัวผมเองอย่างมาก
ดังนั้น จึงลองมาทำความเข้าใจกันหน่อยว่า
interface ในภาษา Go มันเป็นอย่างไร และใช้งานอย่างไร

เริ่มต้นก่อนว่า interface ในภาษา Go นั้น
ไม่มีการเขียน implement แบบในภาษาอื่นๆ เช่น

class MyImplement implements MyInterface {}

แต่สามารถใช้งานเพียงกำหนด function ที่ต้องการใน interface
แล้ว compiler จะจัดการให้เอง
และจงจำไว้ว่า interface คือ type ชนิดหนึ่งนะครับ
ตัวอย่างเช่น
สร้าง interface ชื่อ Shape โดยมี function Area() ไว้สำหรับคำนวรพื้นที่ของ Shape ต่างๆ

type Shaper interface {
   Area()
}

ใน Go นั้น interface จะต้องลงท้ายด้วย -er เสมอ เป็นเพียงข้อตกลงเท่านั้น
ใช้หรือไม่ใช้ก็ได้ ใช้เป็นการแยกแยะให้ชัดเจนเท่านั้นเอง

เมื่อต้องการสร้าง implement class แล้วสามารถสร้างได้ดังนี้

type Rectangle struct {
   width float64
   height float64
}

func (rectangle Rectangle) Area() {
   return rectangle.width * rectangle.height
}

สังเกตได้ว่า
ชื่อ function Area() ตรงกับที่ประกาศไว้ใน interface Shaper
ดังนั้น Rectangle จึงทำการ implement มาจาก interface Shaper โดยอัตโนมัติ
ทำให้ภาษา Go แตกต่างจากภาษอื่นๆ
ส่วนแนวคิดเรื่อง interface ยังคงเหมือนในโลก OOP นะครับ

เราสามารถเขียน Class diagram ได้ดังรูป

78ab1y

ตัวอย่าง code ที่มี Shape ทั้ง 3 แบบ คือ Rectangle, Square และ Circle


ตัวอย่างที่เห็นได้ชัดใน Go เช่น HTTP Request จากการใช้งาน package net/http นั่นเอง

มี interface Handler เอาไว้ให้เรา implemen สำหรับการดักจับ request ต่างๆ

type Handler interface {
   ServeHTTP(ResponseWriter, *Request)
}

ดังนั้นเราจึงสามารถ implement ได้ดังนี้

จากตัวอย่างเหล่านี้ น่าจะพอทำให้เห็นว่า interface ในภาษา Go เป็นอย่างไร
และสามารถใช้งานได้อย่างไร
ส่วนรายละเอียดลึกๆ ของ interface ยังมีอีกนะครับ ลองศึกษาและใช้งานกันดูครับ

Reference Website
http://golang.org/doc/effective_go.html#interface_methods
http://golangtutorials.blogspot.com/2011/06/interfaces-in-go.html
http://blog.natefinch.com/2014/05/intro-to-go-interfaces.html

Tags: