go語言中的interface使用實(shí)例
go語言中的interface是一組未實(shí)現(xiàn)的方法的集合,如果某個(gè)對象實(shí)現(xiàn)了接口中的所有方法,那么此對象就實(shí)現(xiàn)了此接口。與其它面向?qū)ο笳Z言不同的是,go中無需顯示聲明調(diào)用了哪個(gè)接口。
package main
import (
"fmt"
)
type I interface {
Get() int
Put(int)
}
type S struct{ i int }
func (p *S) Get() int { return p.i }
func (p *S) Put(v int) { p.i = v }
type R struct{ i int }
func (p *R) Get() int { return p.i }
func (p *R) Put(v int) { p.i = v }
func f1(p I) {
fmt.Println(p.Get())
p.Put(1)
}
//interface{}空接口,能接受任何類型。.(I)是類型斷言,用于轉(zhuǎn)換something到I類型的接口
func f2(p interface{}) {
if t, ok := p.(S); ok {
fmt.Println("S:", t)
} else if t, ok := p.(I); ok {
fmt.Println("I:", t.Get())
}
}
func f3(p interface{}) {
switch t := p.(type) {
case S:
fmt.Println("S:", t.Get())
case R:
fmt.Println("R:", t.Get())
case I:
fmt.Println("I:", t.Get())
default:
fmt.Println("unknow type")
}
}
func main() {
s := S{101}
f1(&s)
f2(&s)
r := R{1111}
f3(&r)
}
如上結(jié)構(gòu)S實(shí)現(xiàn)了I的兩個(gè)方法,因此S實(shí)現(xiàn)了I。因?yàn)镾實(shí)現(xiàn)了I,因此可以調(diào)用f向其傳遞S類型值得指針。
總結(jié)如下:
(1)使用“comma, ok” 來判斷一個(gè)接口類型是否實(shí)現(xiàn)了某個(gè)特定接口:
if t, ok := something.(I) ; ok {
// 對于某些實(shí)現(xiàn)了接口I 的
// t 是其所擁有的類型
}
(2)聲明為 interface 類型的變量,可以存儲任何實(shí)現(xiàn)了 interface 中所有方法的類型的變量
(3)空接口可代表任何類型,可做形參和返回類型
package main
import "fmt"
func main() {
//interface{}
var i interface{} = 100
var s interface{} = "hello"
fmt.Printf("i = %d, s = %s\n", i, s)
s = i
fmt.Printf("i = %d, s = %d\n", i, s)
}
(4)interface組合
將一個(gè) interface1 嵌入到另一個(gè) interface2 的聲明中,其作用相當(dāng)于把 interface1 的函數(shù)包含到 interface2 中,但是組合中不同有重復(fù)的方法
注:
a. 只要兩個(gè)接口中的方法列表相同(與順序無關(guān)),即為相同的接口,可以相互賦值
b. interface1 的方法列表屬于另一個(gè) interface2 的方法列表的子集,interface2 可以賦值給 interface1,反之不成立(因?yàn)榉椒ㄈ笔?,interface2 中的方法會覆蓋 interface1 中同名的方法
c. 可以嵌入包中的 interface
相關(guān)文章
Go信號處理如何優(yōu)雅地關(guān)閉你的應(yīng)用
Go?中的優(yōu)雅關(guān)閉機(jī)制使得在應(yīng)用程序接收到終止信號時(shí),能夠進(jìn)行平滑的資源清理,通過使用?context?來管理?goroutine?的生命周期,結(jié)合?signal?包捕獲系統(tǒng)信號,你可以在?Go?應(yīng)用中實(shí)現(xiàn)一個(gè)健壯且優(yōu)雅的關(guān)閉過程,對Go關(guān)閉應(yīng)用相關(guān)操作感興趣的朋友一起看看吧2025-01-01
golang Iris運(yùn)行多個(gè)應(yīng)用的實(shí)現(xiàn)
本文主要介紹了golang Iris運(yùn)行多個(gè)應(yīng)用的實(shí)現(xiàn),在Iris里面,提供了一種方式可以讓我們同時(shí)運(yùn)行多個(gè)應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Go實(shí)現(xiàn)整合Logrus實(shí)現(xiàn)日志打印
這篇文章主要介紹了Go實(shí)現(xiàn)整合Logrus實(shí)現(xiàn)日志打印,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
幾個(gè)小技巧幫你實(shí)現(xiàn)Golang永久阻塞
Go 的運(yùn)行時(shí)的當(dāng)前設(shè)計(jì),假定程序員自己負(fù)責(zé)檢測何時(shí)終止一個(gè) goroutine 以及何時(shí)終止該程序。有時(shí)候我們需要的是使程序阻塞在這一行,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下2021-12-12
golang復(fù)用http.request.body的方法示例
這篇文章主要給大家介紹了關(guān)于golang復(fù)用http.request.body的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10

