Golang語言中的interface是什麼(上)
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()
}
}
相關文章
- Golang語言中的interface是什麼(下)Golang
- Golang語言中的method是什麼Golang
- 為什麼在Go語言中要慎用interface{}Go
- 在R語言中,因子是什麼R語言
- "->" 在c語言中是什麼意思?C語言
- Python語言中/與//的區別是什麼?Python
- Golang | 既是介面又是型別,interface是什麼神仙用法?Golang型別
- C語言中陣列溢位是什麼C語言陣列
- 什麼是 constructor signature in interfaceStruct
- C++語言中 *與&的作用分別是什麼啊?C++
- Go語言中結構體打Tag是什麼意思?Go結構體
- Python語言中__init__與__new__的區別是什麼?Python
- 嵌入式C語言中的組成結構是什麼C語言
- Python語言中變數名是什麼?命名規則有哪些?Python變數
- async/await 在 C# 語言中是如何工作的?(上)AIC#
- c語言以及高階語言中的float到底是什麼以及IEEE754C語言
- 什麼是Java Marker Interface(標記介面)Java
- Python語言中=和==有什麼區別?Python
- Golang之interfaceGolang
- Golang | Go語言多型的實現與interface使用Golang多型
- 在 Go 語言中,我為什麼使用介面Go
- 各語言中的三元運算子與 golang 對比Golang
- 【Golang詳解】go語言中併發安全和鎖Golang
- Python語言中合法變數命名有什麼規則?Python變數
- Python是什麼語言?Python底層語言是什麼?Python
- golang使用sqlx報錯:unsupported type []interface {}, a slice of interfaceGolangSQL
- Golang context (上下文)是什麼GolangContext
- C語言中的關鍵字有哪些,分別代表什麼意思C語言
- Python語言中的模組、包、庫之間有什麼區別?Python
- 為什麼python在眾多程式語言中脫穎而出?Python
- Python學習教程_Python語言中=和==有什麼區別?Python
- 程式語言中為什麼使用分號作為語句結束符?
- 企業上雲是什麼意思?企業上雲的好處是什麼?
- 什麼是r語言R語言
- python語言是什麼Python
- 使用Golang的interface介面設計原則Golang
- 語言是 Go 還是 Golang?Golang
- go語言中make和new有什麼作用以及區別?Go