最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go 中燒腦的接口及空接口

 更新時(shí)間:2024年02月17日 09:41:35   作者:燈火消逝的碼頭  
在Go語(yǔ)言的實(shí)際編程中,幾乎所有的數(shù)據(jù)結(jié)構(gòu)都圍繞接口展開,接口是Go語(yǔ)言中所有數(shù)據(jù)結(jié)構(gòu)的核心,這篇文章主要介紹了Go 中燒腦的接口,需要的朋友可以參考下

基本定義

Go 官方對(duì)于接口的定義是一句話:An interface type is defined as a set of method signatures. 翻譯過(guò)來(lái)就是,一個(gè)接口定義了一組方法的集合。這和 Java 和 PHP 的接口類似,定義一組方法而不定義方法的具體實(shí)現(xiàn)。但是與 Java 和 PHP 迥然不同的地方在于 Go 不需要顯式的聲明 implements 關(guān)鍵詞來(lái)繼承接口,一個(gè)類型只要實(shí)現(xiàn)了接口中的所有方法,就視作繼承了該接口,是隱式實(shí)現(xiàn)的。來(lái)看一個(gè)基本的使用示例: 

// 定義一個(gè)平臺(tái)接口,包含一個(gè)支付方法
type Platform interface {
	Pay(amount int) error
}
// 微信平臺(tái)
type Wechat struct{}
func (w *Wechat) Pay(amount int) error {
	fmt.Printf("wechat amount: %d\n", amount)
	return nil
}
// 支付寶平臺(tái)
// 任意值都可以實(shí)現(xiàn)接口,并非一定需要struct
type Alipay int
func (a Alipay) Pay(amount int) error {
	fmt.Printf("alipay amount: %d, a: %d\n", amount, a)
	return nil
}
func ExamplePlatform() {
	var (
		p Platform
		w        = Wechat{}
		a Alipay = 1
	)
	p = &w
	p.Pay(2)
	p = &a
	p.Pay(3)
	// 這種寫法會(huì)報(bào)錯(cuò)
	// p = w
	p = a
	p.Pay(4)
	// Output:
	// wechat amount: 2
	// alipay amount: 3, a: 1
	// alipay amount: 4, a: 1
}

在這個(gè)示例中,我們定義了一個(gè) Platform 接口和兩個(gè)結(jié)構(gòu)體,分別使用了值接收器和指針接收器來(lái)實(shí)現(xiàn)了 Platform 接口。p = w 這行代碼會(huì)報(bào)錯(cuò),究其原因是,對(duì)于使用指針接收器實(shí)現(xiàn)的接口的 Wechat,只有它的指針會(huì)實(shí)現(xiàn)接口,值不會(huì)實(shí)現(xiàn);而對(duì)于值實(shí)現(xiàn)接口的 Alipay,指針和值都會(huì)實(shí)現(xiàn)接口。所以 p = a 可以正常運(yùn)行。

接口嵌套

接口可以嵌套另一個(gè)接口:

// 定義一個(gè)平臺(tái)接口,包含一個(gè)支付方法
type Platform interface {
	Pay(amount int) error
	User
}
type User interface {
	Login()
	Logout()
}
// 微信平臺(tái)
type Wechat struct{}
func (w *Wechat) Pay(amount int) error {
	fmt.Printf("wechat amount: %d\n", amount)
	return nil
}
func (w *Wechat) Login()  {}
func (w *Wechat) Logout() {}

此時(shí),Wechat 即實(shí)現(xiàn)了 Platform 接口,也實(shí)現(xiàn)了 User 接口。

接口類型斷言

再來(lái)看一個(gè)很復(fù)雜的例子,我們將上面的代碼稍作修改,將 Wechat 的 Login 和Logout 提到另一個(gè)結(jié)構(gòu)中,然后使用類型斷言判斷 Wechat 是否實(shí)現(xiàn)了 User 接口:

// 定義一個(gè)平臺(tái)接口,包含一個(gè)支付方法
type Platform interface {
	Pay(amount int) error
	User
}
type User interface {
	Login()
	Logout()
}
type UserS struct {
}
func (u *UserS) Login()  {}
func (u *UserS) Logout() {}
// 微信平臺(tái)
type Wechat struct {
	UserS
}
func (w *Wechat) Pay(amount int) error {
	fmt.Printf("wechat amount: %d\n", amount)
	return nil
}
func ExamplePlatform() {
	var (
		p Platform
		w = Wechat{}
	)
	p = &w
	p.Pay(2)
	// 類型斷言
	_, ok := p.(User)
	fmt.Println(ok)
	// Output:
	// wechat amount: 2
	// true
}

空接口

Go 1.18 新增了一個(gè)新的變量類型:any,其定義如下:

type any = interface{}

其實(shí) any 就是一個(gè)空接口,對(duì)于空接口而言,它沒(méi)有任何方法,所以對(duì)于任意類型的值都相當(dāng)于實(shí)現(xiàn)了空接口,這個(gè)概念和另一個(gè)編程概念十分相似,它就是大名鼎鼎的泛型。在 Go 語(yǔ)言中,fmt.Println 函數(shù)的接收值正是一個(gè) any

func Println(a ...any) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}

使用空接口搭配類型斷言,我們可以設(shè)計(jì)出一個(gè)簡(jiǎn)單的類型轉(zhuǎn)換函數(shù),它將任意類型的值轉(zhuǎn)為 int:

func ToInt(i any) int {
	switch v := i.(type) {
	case int:
		return v
	case float64:
		return int(v)
	case bool:
		if v {
			return 1
		}
		return 0
	case string:
		vint, _ := strconv.Atoi(v)
		return vint
	}
	return 0
}

到此這篇關(guān)于Go 中燒腦的接口的文章就介紹到這了,更多相關(guān)Go 接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言Zap日志庫(kù)使用教程

    Go語(yǔ)言Zap日志庫(kù)使用教程

    在項(xiàng)目開發(fā)中,經(jīng)常需要把程序運(yùn)行過(guò)程中各種信息記錄下來(lái),有了詳細(xì)的日志有助于問(wèn)題排查和功能優(yōu)化;但如何選擇和使用性能好功能強(qiáng)大的日志庫(kù),這個(gè)就需要我們從多角度考慮
    2023-02-02
  • golang第三方庫(kù)mux的實(shí)現(xiàn)

    golang第三方庫(kù)mux的實(shí)現(xiàn)

    Gorilla/mux 是 Go 語(yǔ)言中功能更全面的路由庫(kù),支持參數(shù)匹配、正則、中間件、子路由分組等,本文主要介紹了golang第三方庫(kù)mux的實(shí)現(xiàn),感興趣的可以了解一下
    2025-06-06
  • 一文詳細(xì)介紹golang中.()類型斷言的使用方法

    一文詳細(xì)介紹golang中.()類型斷言的使用方法

    Golang是一門非常流行的編程語(yǔ)言,在很多領(lǐng)域都有著廣泛的應(yīng)用,在開發(fā)過(guò)程中,很多時(shí)候我們需要將函數(shù)作為參數(shù)傳遞給其他函數(shù),這時(shí)候就需要用到golang中的.()用法,本文將詳細(xì)介紹golang中.()的使用方法,需要的朋友可以參考下
    2023-08-08
  • 快速掌握Go語(yǔ)言正/反向代理

    快速掌握Go語(yǔ)言正/反向代理

    這篇文章主要介紹了快速掌握Go語(yǔ)言正/反向代理的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 如何理解Go函數(shù)是一等公民原理及使用場(chǎng)景

    如何理解Go函數(shù)是一等公民原理及使用場(chǎng)景

    這篇文章主要為大家介紹了如何理解Go函數(shù)是一等公民及使用場(chǎng)景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Golang中處理import自定義包出錯(cuò)問(wèn)題的解決辦法

    Golang中處理import自定義包出錯(cuò)問(wèn)題的解決辦法

    最近開始使用Go/GoLand在import自定義包時(shí)出現(xiàn)各種狀況,下面這篇文章主要給大家介紹了關(guān)于Golang中處理import自定義包出錯(cuò)問(wèn)題的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Golang泛型實(shí)現(xiàn)類型轉(zhuǎn)換的方法實(shí)例

    Golang泛型實(shí)現(xiàn)類型轉(zhuǎn)換的方法實(shí)例

    將一個(gè)值從一種類型轉(zhuǎn)換到另一種類型,便發(fā)生了類型轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Golang泛型實(shí)現(xiàn)類型轉(zhuǎn)換的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Golang使用協(xié)程實(shí)現(xiàn)批量獲取數(shù)據(jù)

    Golang使用協(xié)程實(shí)現(xiàn)批量獲取數(shù)據(jù)

    服務(wù)端經(jīng)常需要返回一個(gè)列表,里面包含很多用戶數(shù)據(jù),常規(guī)做法當(dāng)然是遍歷然后讀緩存。使用Go語(yǔ)言后,可以并發(fā)獲取,極大提升效率,本文就來(lái)聊聊具體的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助
    2023-02-02
  • 一文帶你全面掌握Go語(yǔ)言中的正則表達(dá)式

    一文帶你全面掌握Go語(yǔ)言中的正則表達(dá)式

    正則表達(dá)式是一種強(qiáng)大的模式匹配工具,能夠在文本中進(jìn)行靈活的搜索和替換操作,本文將介紹?Golang?中的正則表達(dá)式語(yǔ)法,包括常用的匹配符號(hào)、模式修飾符以及示例應(yīng)用,希望對(duì)大家有所幫助
    2023-05-05
  • 詳解Golang如何實(shí)現(xiàn)節(jié)假日不打擾用戶

    詳解Golang如何實(shí)現(xiàn)節(jié)假日不打擾用戶

    這篇文章主要為大家介紹了Golang如何實(shí)現(xiàn)節(jié)假日不打擾用戶過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論

会泽县| 南宁市| 元氏县| 浦东新区| 海原县| 双流县| 共和县| 阿克| 葫芦岛市| 芜湖县| 伊川县| 台前县| 广元市| 安西县| 白山市| 云和县| 普兰店市| 通化市| 高邑县| 陇南市| 南投市| 隆德县| 梁平县| 桐庐县| 手游| 巫溪县| 合肥市| 库尔勒市| 泸溪县| 葫芦岛市| 丹棱县| 金湖县| 斗六市| 汝城县| 左云县| 信宜市| 托克托县| 岑巩县| 明溪县| 正安县| 济南市|