Golang語言中的interface是什麼(上)

frankphper發表於2019-05-05

interface是一組method簽名的組合,interface可以被任意物件實現,一個物件也可以實現多個interface。任意型別都實現了空interface(也就是包含0個method的interface),空interface可以儲存任意型別的值。interface定義了一組方法,如果某個物件實現了某個介面的所有方法,則此物件就實現了此介面。

package main

import (
    "fmt"
)

// 定義struct
type Human struct {
    name  string
    age   int
    phone string
}
type Student struct {
    Human  // 匿名欄位
    school string
    loan   float32
}
type Employee struct {
    Human   // 匿名欄位
    company string
    money   float32
}

// Human物件實現SayHi()方法
func (h Human) SayHi() {
    fmt.Printf("Hi, I am %s, you can call me on %s\n", h.name, h.phone)
}

// Human物件實現Sing()方法
func (h Human) Sing(lyrics string) {
    fmt.Println("La la la...", lyrics)
}

// Human物件實現Guzzle()方法
func (h Human) Guzzle(beerStein string) {
    fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
}

// Employee物件重寫SayHi()方法
func (e Employee) SayHi() {
    fmt.Printf("Hi I am %s, I work at %s. Call me on %s\n", e.name, e.company, e.phone)
}

// Student物件實現BorrowMoney()方法
func (s Student) BorrowMoney(amount float32) {
    s.loan += amount
}

// Employee物件實現SpendSalary()方法
func (e Employee) SpendSalary(amount float32) {
    e.money -= amount
}

// 定義interface,interface是一組method簽名的組合
// interface可以被任意物件實現,一個物件也可以實現多個interface
// 任意型別都實現了空interface(也就是包含0個method的interface)
// 空interface可以儲存任意型別的值
// interface Men的3個method被Human,Student,Employee實現,也就是這3個物件都實現了interface Men。即:
// interface定義了一組方法,如果某個物件實現了某個介面的所有方法,則此物件就實現了此介面。
type Men interface {
    SayHi()
    Sing(lyrice string)
    Guzzle(beerStein string)
}

// interface YoungChap的BorrowMoney() method只被Student物件實現,也就是隻有Student實現了YoungChap
type YoungChap interface {
    SayHi()
    Sing(song string)
    BorrowMoney(amount float32)
}

// interface ElderlyGent的SpendSalary() method只被Employee物件實現,也就是隻有Employee實現了ElderlyGent
type ElderlyGent interface {
    SayHi()
    Sing(song string)
    SpendSalary(amount float32)
}

func main() {
    // 定義Student型別的變數
    lucy := Student{Human{"lucy", 19, "10086"}, "tsinghua", 100.00}
    lily := Student{Human{"lily", 19, "10086"}, "tsinghua", 100.00}
    liming := Student{Human{"liming", 19, "10086"}, "tsinghua", 100.00}
    // 定義Employee型別的變數
    tom := Employee{Human{"tom", 29, "10000"}, "Google", 200.00}
    // 定義Men型別的變數i
    var i Men
    // i儲存Student
    i = lucy
    fmt.Println("This is lucy, a student:")
    i.SayHi()
    i.Sing("Happy Birthday")
    i.Guzzle("Ha ha ha...")

    // i儲存Employee
    i = tom
    fmt.Println("This is tom, an Employee:")
    i.SayHi()

    // 定義slice Men,包含Men型別元素的切片,這個slice可以被賦予實現了Men介面的任意結構的物件
    fmt.Println("Let's use a slice of Men and see what happens:")
    x := make([]Men, 3)
    // 三個不同型別(不同Method)的元素,實現了同一個interface(Men)
    x[0], x[1], x[2] = lucy, lily, liming
    for _, value := range x {
        value.SayHi()
    }
}

相關文章