欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go 中燒腦的接口及空接口

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

基本定義

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

// 定義一個平臺接口,包含一個支付方法
type Platform interface {
	Pay(amount int) error
}
// 微信平臺
type Wechat struct{}
func (w *Wechat) Pay(amount int) error {
	fmt.Printf("wechat amount: %d\n", amount)
	return nil
}
// 支付寶平臺
// 任意值都可以實現(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)
	// 這種寫法會報錯
	// p = w
	p = a
	p.Pay(4)
	// Output:
	// wechat amount: 2
	// alipay amount: 3, a: 1
	// alipay amount: 4, a: 1
}

在這個示例中,我們定義了一個 Platform 接口和兩個結構體,分別使用了值接收器和指針接收器來實現(xiàn)了 Platform 接口。p = w 這行代碼會報錯,究其原因是,對于使用指針接收器實現(xiàn)的接口的 Wechat,只有它的指針會實現(xiàn)接口,值不會實現(xiàn);而對于值實現(xiàn)接口的 Alipay,指針和值都會實現(xiàn)接口。所以 p = a 可以正常運行。

接口嵌套

接口可以嵌套另一個接口:

// 定義一個平臺接口,包含一個支付方法
type Platform interface {
	Pay(amount int) error
	User
}
type User interface {
	Login()
	Logout()
}
// 微信平臺
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() {}

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

接口類型斷言

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

// 定義一個平臺接口,包含一個支付方法
type Platform interface {
	Pay(amount int) error
	User
}
type User interface {
	Login()
	Logout()
}
type UserS struct {
}
func (u *UserS) Login()  {}
func (u *UserS) Logout() {}
// 微信平臺
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 新增了一個新的變量類型:any,其定義如下:

type any = interface{}

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

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

使用空接口搭配類型斷言,我們可以設計出一個簡單的類型轉換函數(shù),它將任意類型的值轉為 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
}

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

相關文章

  • 使用Golang創(chuàng)建單獨的WebSocket會話

    使用Golang創(chuàng)建單獨的WebSocket會話

    WebSocket是一種在Web開發(fā)中非常常見的通信協(xié)議,它提供了雙向、持久的連接,適用于實時數(shù)據(jù)傳輸和實時通信場景,本文將介紹如何使用 Golang 創(chuàng)建單獨的 WebSocket 會話,包括建立連接、消息傳遞和關閉連接等操作,需要的朋友可以參考下
    2023-12-12
  • Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn)

    Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn)

    這篇文章主要為大家介紹了Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 基于Go語言實現(xiàn)冒泡排序算法

    基于Go語言實現(xiàn)冒泡排序算法

    冒泡排序是交換排序中最簡單的一種算法。這篇文章將利用Go語言實現(xiàn)冒泡排序算法,文中的示例代碼講解詳細,對學習Go語言有一定的幫助,需要的可以參考一下
    2022-12-12
  • Go http client 連接池不復用的問題

    Go http client 連接池不復用的問題

    這篇文章主要介紹了Go http client 連接池不復用的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Golang語言如何讀取http.Request中body的內容

    Golang語言如何讀取http.Request中body的內容

    這篇文章主要介紹了Golang語言如何讀取http.Request中body的內容問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 關于golang中map使用的幾點注意事項總結(強烈推薦!)

    關于golang中map使用的幾點注意事項總結(強烈推薦!)

    map是一種無序的基于key-value的數(shù)據(jù)結構,Go語言中的map是引用類型,必須初始化才能使用,下面這篇文章主要給大家介紹了關于golang中map使用的幾點注意事項,需要的朋友可以參考下
    2023-01-01
  • Go語言為什么很少使用數(shù)組原理解析

    Go語言為什么很少使用數(shù)組原理解析

    這篇文章主要為大家介紹了Go語言為什么很少使用數(shù)組原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go gin框架處理panic的方法詳解

    Go gin框架處理panic的方法詳解

    本文我們介紹下recover在gin框架中的應用, 首先,在golang中,如果在子協(xié)程中遇到了panic,那么主協(xié)程也會被終止,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • golang 如何用反射reflect操作結構體

    golang 如何用反射reflect操作結構體

    這篇文章主要介紹了golang 用反射reflect操作結構體的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go高級特性探究之信號處理詳解

    Go高級特性探究之信號處理詳解

    信號是在Unix和類Unix操作系統(tǒng)中用于通知進程發(fā)生了事件或異常的通信機制,本文主要來介紹一下Go中的信號處理的方法,需要的可以參考一下
    2023-06-06

最新評論