Skip to content

Go | ทำความเข้าใจการทำงานของ Go Interface

Last updated on July 7, 2016

ภาษา Go สามารถ define type พิเศษได้ (struct เหมือนใน C/C++) และสามารถสร้าง type ที่เป็น interface ได้ด้วย และเนื่องจาก Go ไม่มีแนวคิดเรื่อง Class มันเลยยอมให้ type พิเศษเหล่านั้นสามารถมี activity ที่ทำร่วมกับมันได้ โดยใช้  method

เพื่อให้เข้าใจการทำงาน ลองดูโค้ดกากๆ ของผมข้างล่างนี้ครับ

package main

import (
    "fmt"
)

type Activity interface {
    GetName() string
    Walk() string
    Run() string
}

type Human struct {
    name string
}

type Dog struct {
    name string
}

func (h Human) GetName() string {
    return h.name
}

func (h Human) Walk() string {
    return "I'm walking!"
}

func (h Human) Run() string {
    return "I'm running!"
}

func (d Dog) GetName() string {
    return d.name
}

func (d Dog) Walk() string {
    return "Whoop! walking!"
}

func (d Dog) Run() string {
    return "Whoop! running!"
}

func doSomething(act Activity) {
    fmt.Printf("This is %s\n", act.GetName())
    fmt.Println(act.Walk())
    fmt.Println(act.Run())
    fmt.Println()
}

func main() {
    var alice Human = Human{name: "Alice"}
    var bob Dog = Dog{name: "Bob"}

    doSomething(alice)
    doSomething(bob)
}

ตัวอย่างโปรแกรมผม define interface (Activity) และ struct อีก 2 types (Human และ Dog) ปกติแล้ว Human และ Dog สามารถมี method เป็นของตัวเองได้ โดยไม่ต้องพึ่งพา interface แต่ถ้าจะใช้ interface วิธีการก็เหมือนภาษา OOP ทั่วไปคือต้อง implement method ใน struct มาทั้งหมด

สมมุติว่าผมต้องการให้ทั้ง Human และ Dog สามารถ Walk() และ Run() ได้โดยใช้ interface Activity สิ่งที่ผมทำ (ดูโค้ดข้างบนประกอบ) คือให้ Human และ Dog implement method Walk() และ Run() มา ซึ่ง Go ก็จะเข้าใจเอง (imply) ว่าทั้งสอง struct ใช้ interface Activity อยู่ โดยที่เราไม่ต้องเขียน syntax ใดๆ เพิ่มเติมเลย ซึ่งจริงๆ Go ก็ไม่มี syntax ที่จะทำแบบนี้เหมือนกัน

Struct ใดๆ จะ imply interface นั้นได้จำเป็นต้อง implement method ทุก method ใน interface และต้องมีจำนวน, type ของ parameters, return type เหมือนกันด้วย

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

โค้ดข้างบนสามารถเอาไปรันและแก้ไขได้ที่นี่ครับ Go Playground

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.