Skip to main content

สรุปสั้น ๆ

Interface การประกาศ Set ของ Method ใน Go ที่ไม่รู้ไม่ได้น้าาา

เขียนโดย
Sirasit Boonklang (Aeff)
Tech and Coding Consultant

บทความนี้ตีพิมพ์ และ เผยแพร่เมื่อ 16 พฤษภาคม 2566

Interface คืออิหยัง

สำหรับ Interface เป็นอีกหนึ่งฟีเจอร์ที่สำคัญของภาษา Go เรียกว่าถ้าจะเขียนโปรแกรมด้วยภาษา Go ตัวนี้เป็นพื้นฐานตัวนึงที่ Go Developer ต้องรู้เลย โดยการที่เราเข้าใจ Interface จะทำให้เราสามารถเขียนโค้ดได้ Flexible มากยิ่งขึ้น

  1. Facilitate code reuse: เราสามารถ reuse เอาโค้ดที่เขียนไว้มาใช้ซ้ำได้ในส่วนต่าง ๆ ของโปรแกรม
  2. Encourage modular design: สามารถทำเป็นโมดูลได้ ทำให้ง่ายต่อการเปลี่ยนแปลงแก้ไขโค้ด โดยจะป้องกันการทำงานที่ส่งผลกระทบกับส่วนอื่น ๆ ของโปรแกรมที่ใช้ Interface
  3. Improve performance: เมื่อเราเอาโค้ดมา reuse และ ทำเป็นโมดูลได้แล้วก็จะทำให้เราสามารถทำให้ประสิทธิภาพของแอปเราดีขึ้นได้อีกด้วย
  4. 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 ไปเลย !!
เข้าใช้งานระบบ DevLab ฟรี !เรียนรู้เพิ่มเติม

เรียนรู้ไอที “อัพสกิลเขียนโปรแกรม” จากตัวจริง
ปั้นให้คุณเป็น คนสายไอทีระดับมืออาชีพ

BorntoDev

Author BorntoDev

BorntoDev Co., Ltd.

More posts by BorntoDev

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

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

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า