亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語(yǔ)言學(xué)習(xí)之接口類(lèi)型(interface)詳解

 更新時(shí)間:2023年03月29日 09:45:09   作者:sayornottt  
接口是用來(lái)定義行為的類(lèi)型,定義的行為不由接口直接實(shí)現(xiàn),而由通過(guò)方法由定義的類(lèi)型實(shí)現(xiàn),本文就來(lái)和大家詳細(xì)講講Go語(yǔ)言中接口的使用吧

接口

接口是用來(lái)定義行為的類(lèi)型,定義的行為不由接口直接實(shí)現(xiàn),而由通過(guò)方法由定義的類(lèi)型實(shí)現(xiàn)

Golang中,接口是一組方法的簽名,是語(yǔ)言中一個(gè)重要的組成部分,其目的是通過(guò)引入一個(gè)中間層與具體的實(shí)現(xiàn)進(jìn)行分離,達(dá)到解耦合的作用,同時(shí)隱藏底層實(shí)現(xiàn),減少關(guān)注點(diǎn)

Golang不同于Java,通過(guò)隱式實(shí)現(xiàn)聲明的接口,即只要實(shí)現(xiàn)了接口聲明中的方法,就是實(shí)現(xiàn)了接口,
接口的定義需要使用interface關(guān)鍵字,且在接口中只能定義方法簽名,不能包含成員變量

基于官方的io包進(jìn)行分析:

type Reader interface {
   Read(p []byte) (n int, err error)
}

上面是io包中聲明的Reader接口,如果一個(gè)類(lèi)型需要實(shí)現(xiàn)Reader接口,那么就僅需要實(shí)現(xiàn)Read(p []byte) (n int, err error)方法,如LimitedReader就實(shí)現(xiàn)了Reader接口:

type LimitedReader struct {
    R Reader
    N int64
}

func(l *LimitedReader) Read(p []byte) (n int, err error) {
    if ;.N <= 0 {
        return 0, EOF
    }
    if int64(len(p)) > l.N {
        p = p[o:l.N]
    }
    n, err := l.R.Read(p)
    l.N -= int64(n)
    return
}

Golang只會(huì)在參數(shù)傳遞、返回參數(shù)和變量賦值時(shí)對(duì)類(lèi)型是否實(shí)現(xiàn)了某個(gè)接口進(jìn)行檢查,接口在定義方法時(shí)對(duì)實(shí)現(xiàn)的接受者做限制,所以會(huì)有兩種方式實(shí)現(xiàn)接口:結(jié)構(gòu)體實(shí)現(xiàn)和指針實(shí)現(xiàn)。

但這兩種實(shí)現(xiàn)方式不可以同時(shí)存在,Go語(yǔ)言的編譯器會(huì)在結(jié)構(gòu)體類(lèi)型和指針類(lèi)型都實(shí)現(xiàn)同一個(gè)方法時(shí)報(bào)錯(cuò)“method redeclared”

type Cat struct {}
type Duck interface {}

func (c Cat) Quack {} // 結(jié)構(gòu)體實(shí)現(xiàn)
func (c *Cat) Quack {} // 指針實(shí)現(xiàn)

var d Duck = Cat{} // 結(jié)構(gòu)體初始化
var d Duck = &Cat{} // 指針初始化

注意:指針實(shí)現(xiàn)接口,結(jié)構(gòu)體初始化變量是無(wú)法通過(guò)編譯的;而結(jié)構(gòu)體實(shí)現(xiàn)接口,指針初始化變量可以

(Golang在傳遞參數(shù)是值傳遞的,指針初始化變量時(shí),指針可以隱式地獲取到指向的結(jié)構(gòu)體:c.i可以理解成(*c).i)

詳細(xì)理解就是在Golang中,初始化變量后進(jìn)行方法調(diào)用時(shí)會(huì)發(fā)生`值拷貝`:

1.對(duì)于初始化的指針來(lái)說(shuō),意味著拷貝的新指針仍然與原指針一樣,指向一個(gè)相同且唯一的結(jié)構(gòu)體,所以編譯器可以隱式通過(guò)對(duì)變量的解引用(dereference)獲取到指針的結(jié)構(gòu)體

2.而對(duì)于結(jié)構(gòu)體而言,這是拷貝生成了新的結(jié)構(gòu)體,但方法的參數(shù)是指針,編譯器既不可能創(chuàng)建一個(gè)新的指針,即使創(chuàng)建也無(wú)法指向最初調(diào)用該方法的結(jié)構(gòu)體
具體的例子如Goinaction的代碼示例:

listing36.go

package main

import (
    "fmt"
)

type notifier interface {
    notify()
}

type user struct {
    name string
    email string
}

func (u *user) notify() {
    fmt.Printf("Sending user email to %s<%s>)\n",
    u.name,
    u.email)
}

func main() {
    u := user{"Bill", "bill@email.com"}
    
    sendNotification(u)
}

func sendNotification(n notifier) {
    n.notify()
}

仔細(xì)查看代碼就會(huì)發(fā)現(xiàn)u是一個(gè)結(jié)構(gòu)體類(lèi)型,而notify方法是使用指針接受者實(shí)現(xiàn)的,上述代碼自然就無(wú)法編譯通過(guò)

數(shù)據(jù)結(jié)構(gòu)

Golang根據(jù)接口類(lèi)型是否包含一組方法將接口類(lèi)型分成兩類(lèi):

1.使用runtime.iface結(jié)構(gòu)體表示包含方法的接口

type iface struct {
      tab *itab // runtime.itab類(lèi)型結(jié)構(gòu)體,接口類(lèi)型的核心組成部分
      data unsafe.Pointer // 指向原始數(shù)據(jù)的指針
  }

2.使用runtime.eface結(jié)構(gòu)體表示不包含任何方法的interface{}類(lèi)型

type eface struct {
      _type *_type // 指向類(lèi)型的指針
      data unsafe.Pointer // 指向底層數(shù)據(jù)的指針
  }

接口類(lèi)型不是任意類(lèi)型

注意:interface{}類(lèi)型不是任意類(lèi)型,如果將類(lèi)型轉(zhuǎn)換成interface{}類(lèi)型,變量在運(yùn)行期間的類(lèi)型也會(huì)發(fā)生變化,獲取變量類(lèi)型時(shí)會(huì)得到interface{}

package main

type Test struct {}

func NilOrNot(v interface{}) bool {

  return v == nil
}

func main() {

  var s *Test
  fmt.Println(s == nil)
  fmt.Println(NilorNot(s))
}

運(yùn)行上述代碼時(shí),第一行打印true,第二行會(huì)打印false。

出現(xiàn)上述現(xiàn)象的原因就是在調(diào)用NilOrNot函數(shù)時(shí)發(fā)生了隱式的類(lèi)型轉(zhuǎn)換:*Test類(lèi)型轉(zhuǎn)換成interface{},除了這種傳參的情況,在變量賦值也是如此

動(dòng)態(tài)派發(fā)(Dynamic dispatch)是在運(yùn)行期間選擇具體多態(tài)操作(方法或函數(shù))執(zhí)行的過(guò)程,接口的引入使得Golang具備了動(dòng)態(tài)派發(fā)的特性,即在調(diào)用接口類(lèi)型的方法時(shí),如果編譯期間不能確認(rèn)接口的類(lèi)型,則會(huì)在運(yùn)行期間決定具體調(diào)用該方法的具體實(shí)現(xiàn)

動(dòng)態(tài)派發(fā)在結(jié)構(gòu)體上的表現(xiàn)非常差,應(yīng)當(dāng)盡量避免使用結(jié)構(gòu)體類(lèi)型實(shí)現(xiàn)接口

到此這篇關(guān)于Go語(yǔ)言學(xué)習(xí)之接口類(lèi)型(interface)詳解的文章就介紹到這了,更多相關(guān)Go語(yǔ)言接口類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang切片連接成字符串的實(shí)現(xiàn)示例

    Golang切片連接成字符串的實(shí)現(xiàn)示例

    本文主要介紹了Golang切片連接成字符串的實(shí)現(xiàn)示例,可以使用Go語(yǔ)言中的內(nèi)置函數(shù)"String()"可以將字節(jié)切片轉(zhuǎn)換為字符串,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Golang算法問(wèn)題之整數(shù)拆分實(shí)現(xiàn)方法分析

    Golang算法問(wèn)題之整數(shù)拆分實(shí)現(xiàn)方法分析

    這篇文章主要介紹了Golang算法問(wèn)題之整數(shù)拆分實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言數(shù)值運(yùn)算與數(shù)組遍歷相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • Go操作各大消息隊(duì)列教程(RabbitMQ、Kafka)

    Go操作各大消息隊(duì)列教程(RabbitMQ、Kafka)

    消息隊(duì)列是一種異步的服務(wù)間通信方式,適用于無(wú)服務(wù)器和微服務(wù)架構(gòu),本文主要介紹了Go操作各大消息隊(duì)列教程(RabbitMQ、Kafka),需要的朋友可以了解一下
    2024-02-02
  • Golang HTTP請(qǐng)求Json響應(yīng)解析方法以及解讀失敗的原因

    Golang HTTP請(qǐng)求Json響應(yīng)解析方法以及解讀失敗的原因

    這篇文章主要介紹了Golang HTTP請(qǐng)求Json響應(yīng)解析方法以及解讀失敗的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 基于Go語(yǔ)言實(shí)現(xiàn)猜謎游戲

    基于Go語(yǔ)言實(shí)現(xiàn)猜謎游戲

    這篇文章主要為大家詳細(xì)介紹了如何基于Go語(yǔ)言實(shí)現(xiàn)猜謎游戲,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)
    2023-09-09
  • 一文帶你了解Go語(yǔ)言fmt標(biāo)準(zhǔn)庫(kù)輸出函數(shù)的使用

    一文帶你了解Go語(yǔ)言fmt標(biāo)準(zhǔn)庫(kù)輸出函數(shù)的使用

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中 fmt 標(biāo)準(zhǔn)庫(kù)輸出函數(shù)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 深入了解Golang中的反射機(jī)制

    深入了解Golang中的反射機(jī)制

    反射是指在程序運(yùn)行時(shí)動(dòng)態(tài)地檢查和修改對(duì)象的能力,在Go語(yǔ)言中,通過(guò)反射可以在運(yùn)行時(shí)檢查變量的類(lèi)型、獲取結(jié)構(gòu)體字段和方法的信息,以及動(dòng)態(tài)調(diào)用方法等操作,本文將帶你深入了解Golang中的反射機(jī)制,感興趣的同學(xué)可以跟著小編一起來(lái)學(xué)習(xí)
    2023-05-05
  • Go gRPC超時(shí)控制Deadlines用法詳解

    Go gRPC超時(shí)控制Deadlines用法詳解

    這篇文章主要為大家介紹了Go gRPC超時(shí)控制Deadlines用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 解決golang讀取http的body時(shí)遇到的坑

    解決golang讀取http的body時(shí)遇到的坑

    這篇文章主要介紹了解決golang讀取http的body時(shí)遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang的os包用法詳解

    golang的os包用法詳解

    Go語(yǔ)言的 os 包中提供了操作系統(tǒng)函數(shù)的接口,是一個(gè)比較重要的包。顧名思義,os 包的作用主要是在服務(wù)器上進(jìn)行系統(tǒng)的基本操作,本文將詳細(xì)介紹了golang的os包用法,需要的朋友可以參考下
    2023-05-05

最新評(píng)論