Golang語言中的interface是什麼(下)
interface介面還可以作為函式引數,因為interface的變數可以持有任意實現該interface型別的物件,我們可以通過定義interface引數,讓函式接受各種型別的引數。 判斷interface變數儲存的元素的型別,目前常用的有兩種方法:Comma-ok斷言和switch測試。
/**
* interface介面作為函式引數
* 判斷interface變數儲存的元素的型別
*/
package main
import (
"fmt"
"strconv"
)
// 定義Human物件
type Human struct {
name string
age int
phone string
}
// 定義空介面
type Element interface{}
// 定義切片
type List []Element
// 定義Person物件
type Person struct {
name string
age int
}
// 通過定義interface引數,讓函式接受各種型別的引數
// 通過這個Method(方法),Human物件實現了fmt.Stringer介面
// Stringer介面是fmt.Println()的引數,最終使得Human物件可以作為fmt.Println的引數被呼叫
func (h Human) String() string {
return "<" + h.name + " - " + strconv.Itoa(h.age) + " years - phone: " + h.phone + ">"
}
// 通過定義interface引數,讓函式接受各種型別的引數
// 通過這個Method(方法),Person物件實現了fmt.Stringer介面
// Stringer介面是fmt.Println()的引數,最終使得Person物件可以作為fmt.Println的引數被呼叫
func (p Person) String() string {
return "(name: " + p.name + " - age: " + strconv.Itoa(p.age) + " years)"
}
func main() {
// interface作為函式的引數傳遞
Lucy := Human{"Lucy", 29, "10086"}
fmt.Println("This human is:", Lucy)
list := make(List, 3)
list[0] = 100
list[1] = "Hello Golang!"
list[2] = Person{"Lily", 19}
// Comma-ok斷言
for index, element := range list {
// 判斷變數的型別 格式:value, ok = element(T)
// value是interface變數的值,ok是bool型別,element是interface的變數,T是斷言的interface變數的型別
if value, ok := element.(int); ok {
fmt.Printf("list[%d] is an int and it's value is %d\n", index, value)
} else if value, ok := element.(string); ok {
fmt.Printf("list[%d] is a string and it's value is %s\n", index, value)
} else if value, ok := element.(Person); ok {
fmt.Printf("list[%d] is a Person and it's value is %s\n", index, value)
} else {
fmt.Printf("list[%d] is a different type\n", index)
}
}
// switch
for index, element := range list {
// 注意:element.(type)語法不能在switch外的任何邏輯中使用
switch value := element.(type) {
case int:
fmt.Printf("list[%d] is an int, it's value is %d\n", index, value)
case string:
fmt.Printf("list[%d] is a string, it's value is %s\n", index, value)
case Person:
fmt.Printf("list[%d] is a Person, it's value is %s\n", index, value)
default:
fmt.Printf("list[%d] is a differernt type", index)
}
}
}
相關文章
- 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變數
- c語言以及高階語言中的float到底是什麼以及IEEE754C語言
- 什麼是Java Marker Interface(標記介面)Java
- async/await 在 C# 語言中是如何工作的?(下)AIC#
- 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
- 什麼是程式語言,什麼是Python直譯器Python