สรุปสั้น ๆ
Interface การประกาศ Set ของ Method ใน Go ที่ไม่รู้ไม่ได้น้าาา
เขียนโดย
Sirasit Boonklang (Aeff)
Tech and Coding Consultant
บทความนี้ตีพิมพ์ และ เผยแพร่เมื่อ 16 พฤษภาคม 2566
Interface คืออิหยัง
สำหรับ Interface เป็นอีกหนึ่งฟีเจอร์ที่สำคัญของภาษา Go เรียกว่าถ้าจะเขียนโปรแกรมด้วยภาษา Go ตัวนี้เป็นพื้นฐานตัวนึงที่ Go Developer ต้องรู้เลย โดยการที่เราเข้าใจ Interface จะทำให้เราสามารถเขียนโค้ดได้ Flexible มากยิ่งขึ้น
- Facilitate code reuse: เราสามารถ reuse เอาโค้ดที่เขียนไว้มาใช้ซ้ำได้ในส่วนต่าง ๆ ของโปรแกรม
- Encourage modular design: สามารถทำเป็นโมดูลได้ ทำให้ง่ายต่อการเปลี่ยนแปลงแก้ไขโค้ด โดยจะป้องกันการทำงานที่ส่งผลกระทบกับส่วนอื่น ๆ ของโปรแกรมที่ใช้ Interface
- Improve performance: เมื่อเราเอาโค้ดมา reuse และ ทำเป็นโมดูลได้แล้วก็จะทำให้เราสามารถทำให้ประสิทธิภาพของแอปเราดีขึ้นได้อีกด้วย
- Enhance readability and maintainability: ช่วยทำให้โค้ดอ่านง่ายและแก้ไขปรับปรุงได้ง่าย ลดปัญหาการยืนงงในดงโค้ดของคนอื่นและตัวเองได้ 555
ค่าของตัวแปรชนิด Interface สามารถเก็บค่าที่เป็น Type ไหนก็ได้สำหรับการ Implement Method นั้น ๆ โดยตัวอย่างหน้าตาของการใช้ Interface
package main
import (
"fmt"
"math"
)
type Abser interface {
Abs() float64
}
func main() {
var a Abser
f := MyFloat(-math.Sqrt2)
v := Vertex{3, 4}
a = f // a MyFloat implements Abser
a = &v // a *Vertex implements Abser
// In the following line, v is a Vertex (not *Vertex)
// and does NOT implement Abser.
a = v
fmt.Println(a.Abs())
}
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
โดยโค้ดนี้จะเป็นตัวอย่างการทำงานของ Interface ที่ชื่อว่า Abser โดยจะมี Method เดียวคือ Abs() ที่ Return ค่าออกมาเป็นเลขทศนิยมแบบ 64 bit โดย Type ไหนที่มีการ Implement Method นี้จะสามารถใช้งาน Interface ได้
โดยด้านบนจะมีการประกาศมา 2 Type คือ MyFloat และ Vertex
- MyFloat เป็น Type ที่แสดงถึงเลขทศนิยม
type MyFloat float64
- Vertex เป็น Type ที่แสดงถึงจุดตัวในเรขาคณิต
type Vertex struct {
X, Y float64
}
ทั้ง MyFloat และ Vertex มี Method Abs() ที่ Return ค่าสัมบูรณ์ของตัวเลขหรือความยาวของจุด เนื่องจากทั้งสองประเภทมี Method นี้จึงใช้ Interface Abser ได้
ใน main ฟังก์ชัน ตัวแปร a ถูกประกาศเป็น Abser Type หมายความว่าสามารถเก็บค่าใด ๆ ที่ตรงกับ Interface ของ Abser ได้
var a Abser
จากนั้นตัวแปรสองตัว f และ v จะถูกประกาศเป็น MyFloat และ Vertex ตามลำดับ
f := MyFloat(-math.Sqrt2)
v := Vertex{3, 4}
โค้ดแสดงให้เห็นว่าทั้ง MyFloat และ Vertex ตอบสนอง กับ Abser Interface โดยกำหนดให้กับตัวแปร a
อย่างไรก็ตาม เมื่อค่าที่ไม่ใช่ Pointer ของ Vertex โดย v ถูกกำหนดให้กับตัวแปร a จะส่งผลให้เกิด Error ตอน Compile เนื่องจากค่า Vertex ไม่เป็นไปตาม Interface Abser
สุดท้าย Abs() จะเก็บค่าในตัวแปร a ที่เรียกใช้ แล้วก็ใช้ฟังก์ชัน fmt.Println แสดงผลลัพธ์ออกมานั่นเอง
จากโค้ดด้านบนจะเห็นการทำงานของ Interface ใน Go โดยการประกาศ Interface และการใช้งาน Interfaceใน 2 ประเภทที่แตกต่างกัน พร้อมวิธีการกำหนด Type ให้กับตัวแปรของ Type ของ Interface ต่าง ๆ นั่นเอง
หากใครอยากเรียนรู้พื้นฐานเกี่ยวกับภาษา Go เพิ่มเติม เรามีคอร์สเรียนฟรี ****Introduction to Go Programming Language สามารถศึกษาเพิ่มเติมได้ที่ลิงก์นี้เลยยย https://school.borntodev.com/course/introduction-to-go-programming-language
Reference: A Tour of Go
ระบบฝึกทักษะ การเขียนโปรแกรม
ที่พร้อมตรวจผลงานคุณ 24 ชั่วโมง
- โจทย์ปัญหากว่า 200 ข้อ ที่รอท้าทายคุณอยู่
- รองรับ 9 ภาษาโปรแกรมหลัก ไม่ว่าจะ Java, Python, C ก็เขียนได้
- ใช้งานได้ฟรี ! ครบ 20 ข้อขึ้นไป รับ Certificate ไปเลย !!