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

Go?Interface接口初學(xué)者手冊(cè)

 更新時(shí)間:2024年01月18日 09:36:22   作者:海上明月A  
這篇文章主要為大家介紹了Go?Interface接口的基礎(chǔ)用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Interface接口類(lèi)型實(shí)現(xiàn)

接口是一組方法簽名。如果一個(gè)類(lèi)型在其上定義了給定接口的所有方法,則該類(lèi)型 "實(shí)現(xiàn)" 了該接口。

在以下示例中,“形狀” 必須能夠返回其面積和周長(zhǎng)。rect 和 circle 都滿(mǎn)足該接口。

type shape interface {
  area() float64
  perimeter() float64
}
type rect struct {
    width, height float64
}
func (r rect) area() float64 {
    return r.width * r.height
}
func (r rect) perimeter() float64 {
    return 2*r.width + 2*r.height
}
type circle struct {
    radius float64
}
func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
func (c circle) perimeter() float64 {
    return 2 * math.Pi * c.radius
}

當(dāng)一個(gè)類(lèi)型實(shí)現(xiàn)一個(gè)接口時(shí),它可以被用作該接口類(lèi)型。

接口的實(shí)現(xiàn)是隱式的。

類(lèi)型從不聲明它實(shí)現(xiàn)了給定的接口。如果接口存在,并且類(lèi)型定義了適當(dāng)?shù)姆椒?,那么該?lèi)型會(huì)自動(dòng)滿(mǎn)足該接口。

Multiple Interfaces

在Go中,一個(gè)類(lèi)型可以實(shí)現(xiàn)任意數(shù)量的接口。例如,空接口 interface{} 總是被每種類(lèi)型實(shí)現(xiàn),因?yàn)樗鼪](méi)有要求。

Naming interface args

考慮以下接口:

type Copier interface {
  Copy(string, string) int
}

根據(jù)僅有的代碼,你能推斷出應(yīng)該將什么類(lèi)型的字符串傳遞給 Copy 函數(shù)嗎?

我們知道函數(shù)簽名期望兩個(gè)字符串類(lèi)型,但它們是什么?文件名?URL?原始字符串?dāng)?shù)據(jù)?另外,返回的那個(gè)整數(shù)到底是什么?

讓我們添加一些有名的參數(shù)和返回?cái)?shù)據(jù),使其更清晰。

type Copier interface {
  Copy(sourceFile string, destinationFile string) (bytesCopied int)
}

好多了?,F(xiàn)在我們可以看到期望是什么了。第一個(gè)參數(shù)是 sourceFile,第二個(gè)參數(shù)是 destinationFile,并返回了一個(gè)整數(shù) bytesCopied

Type Assertions in Go

在Go中使用接口時(shí),偶爾需要訪(fǎng)問(wèn)接口值的底層類(lèi)型。您可以使用類(lèi)型斷言將接口轉(zhuǎn)換為其底層類(lèi)型。

type shape interface {
  area() float64
}
type circle struct {
  radius float64
}
// "c" is a new circle cast from "s"
// which is an instance of a shape.
// "ok" is a bool that is true if s was a circle
// or false if s isn't a circle
c, ok := s.(circle)
if !ok {
  // s wasn't a circle
  log.Fatal("s is not a circle")
}
radius := c.radius

Type Switches in Go

類(lèi)型開(kāi)關(guān)使得在一系列中執(zhí)行多個(gè)類(lèi)型斷言變得很容易。

類(lèi)型開(kāi)關(guān)類(lèi)似于常規(guī)的開(kāi)關(guān)語(yǔ)句,但是情況指定的是類(lèi)型而不是值。

func printNumericValue(num interface{}) {
  switch v := num.(type) {
  case int:
    fmt.Printf("%T\n", v)
  case string:
    fmt.Printf("%T\n", v)
  default:
    fmt.Printf("%T\n", v)
  }
}
func main() {
  printNumericValue(1)
  // prints "int"
  printNumericValue("1")
  // prints "string"
  printNumericValue(struct{}{})
  // prints "struct {}"
}

fmt.Printf("%T\n", v) 打印變量的類(lèi)型。

Clean Interfaces

編寫(xiě)清晰的接口很難。坦率地說(shuō),每當(dāng)在代碼中處理抽象概念時(shí),如果不小心,簡(jiǎn)單的事情很快就會(huì)變得復(fù)雜。讓我們回顧一些保持接口清晰的經(jīng)驗(yàn)法則。

 Keep Interfaces Small

如果你從這篇文章中只記住一點(diǎn)建議,那就是:保持接口的小巧!接口的目的是定義準(zhǔn)確表示一個(gè)想法或概念所需的最小行為。

以下是標(biāo)準(zhǔn) HTTP 包中的一個(gè)較大接口的示例,它很好地演示了定義最小行為的概念:

type File interface {
    io.Closer
    io.Reader
    io.Seeker
    Readdir(count int) ([]os.FileInfo, error)
    Stat() (os.FileInfo, error)
}

滿(mǎn)足接口行為的任何類(lèi)型都可以被 HTTP 包視為 File。這很方便,因?yàn)?HTTP 包不需要知道它處理的是磁盤(pán)上的文件,網(wǎng)絡(luò)緩沖區(qū)還是簡(jiǎn)單的 []byte。

 Interfaces Should Have No Knowledge of Satisfying Types

接口應(yīng)該定義其他類(lèi)型需要滿(mǎn)足的條件以成為該接口的成員。它們?cè)谠O(shè)計(jì)時(shí)不應(yīng)該知道任何恰好滿(mǎn)足該接口的類(lèi)型。

例如,假設(shè)我們正在構(gòu)建一個(gè)描述定義汽車(chē)所需組件的接口。

type car interface {
  Color() string
  Speed() int
  IsFiretruck() bool
}

Color() 和 Speed() 完全有道理,它們是限定在汽車(chē)范圍內(nèi)的方法。IsFiretruck() 是一個(gè)反模式。我們強(qiáng)制所有汽車(chē)聲明它們是否是消防車(chē)。為了使這種模式有任何意義,我們需要一個(gè)可能的子類(lèi)型清單。IsPickup()IsSedan()、IsTank()... 這會(huì)無(wú)休止地?cái)U(kuò)展。

相反,開(kāi)發(fā)人員應(yīng)該依賴(lài)于類(lèi)型斷言的本機(jī)功能,在給定汽車(chē)接口的實(shí)例時(shí)推導(dǎo)出底層類(lèi)型?;蛘撸绻枰咏涌?,可以這樣定義:

type firetruck interface {
  car
  HoseLength() int
}

這個(gè)接口繼承了 car 所需的方法,并添加了一個(gè)額外的必需方法,使車(chē)輛成為消防車(chē)。

Interfaces Are Not Classes

接口不是類(lèi),它們更加輕量。

接口沒(méi)有構(gòu)造函數(shù)或析構(gòu)函數(shù),不要求創(chuàng)建或銷(xiāo)毀數(shù)據(jù)。

接口在本質(zhì)上不是層次結(jié)構(gòu),盡管有語(yǔ)法糖可以創(chuàng)建接口,這些接口碰巧是其他接口的超集。

接口定義了函數(shù)簽名,但不定義底層行為。創(chuàng)建接口通常不會(huì)在結(jié)構(gòu)方法方,使代碼更加干燥。例如,如果有五種類(lèi)型滿(mǎn)足 fmt.Stringer 接口,它們都需要有自己版本的 String() 函數(shù)。

以上就是Go Interfaces接口初學(xué)者手冊(cè)的詳細(xì)內(nèi)容,更多關(guān)于Go Interfaces接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go 代碼的調(diào)試---打印調(diào)用堆棧的實(shí)例

    go 代碼的調(diào)試---打印調(diào)用堆棧的實(shí)例

    下面小編就為大家?guī)?lái)一篇go 代碼的調(diào)試---打印調(diào)用堆棧的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Go語(yǔ)言中未知異常捕獲的多種場(chǎng)景與實(shí)用技巧

    Go語(yǔ)言中未知異常捕獲的多種場(chǎng)景與實(shí)用技巧

    在Go語(yǔ)言編程中,異常處理是確保程序健壯性的關(guān)鍵環(huán)節(jié),與一些其他編程語(yǔ)言不同,Go沒(méi)有傳統(tǒng)的try - catch結(jié)構(gòu)化異常處理機(jī)制,本文將深入探討Go語(yǔ)言中未知異常捕獲的多種場(chǎng)景與實(shí)用技巧,需要的朋友可以參考下
    2024-11-11
  • Go語(yǔ)言中GOMAXPROCS的設(shè)置使用

    Go語(yǔ)言中GOMAXPROCS的設(shè)置使用

    GOMAXPROCS是Go語(yǔ)言并發(fā)控制的關(guān)鍵設(shè)置,其默認(rèn)值與機(jī)器CPU核心數(shù)相同,本文就來(lái)介紹一下Go語(yǔ)言中GOMAXPROCS的設(shè)置使用,感興趣的可以了解一下
    2024-11-11
  • Golang實(shí)現(xiàn)Redis分布式鎖(Lua腳本+可重入+自動(dòng)續(xù)期)

    Golang實(shí)現(xiàn)Redis分布式鎖(Lua腳本+可重入+自動(dòng)續(xù)期)

    本文主要介紹了Golang分布式鎖實(shí)現(xiàn),采用Redis+Lua腳本確保原子性,持可重入和自動(dòng)續(xù)期,用于防止超賣(mài)及重復(fù)下單,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-05-05
  • golang validator參數(shù)校驗(yàn)的實(shí)現(xiàn)

    golang validator參數(shù)校驗(yàn)的實(shí)現(xiàn)

    這篇文章主要介紹了golang validator參數(shù)校驗(yàn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊

    Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊

    這篇文章介紹了Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C語(yǔ)言的10大基礎(chǔ)算法

    C語(yǔ)言的10大基礎(chǔ)算法

    算法是一個(gè)程序和軟件的靈魂,作為一名優(yōu)秀的程序員,只有對(duì)一些基礎(chǔ)的算法有著全面的掌握,才會(huì)在設(shè)計(jì)程序和編寫(xiě)代碼的過(guò)程中顯得得心應(yīng)手。這篇文章主要介紹了C語(yǔ)言的10大基礎(chǔ)算法,需要的朋友可以參考下
    2019-09-09
  • go code review 代碼調(diào)試

    go code review 代碼調(diào)試

    這篇文章主要為大家介紹了go code review 代碼調(diào)試方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 深入理解go unsafe用法及注意事項(xiàng)

    深入理解go unsafe用法及注意事項(xiàng)

    go雖然是一種高級(jí)語(yǔ)言,但是也還是給開(kāi)發(fā)者提供了指針的類(lèi)型unsafe.Pointer,我們可以通過(guò)它來(lái)直接讀寫(xiě)變量的內(nèi)存,本文來(lái)了解一下?unsafe?里所能提供的關(guān)于指針的一些功能,以及使用unsafe.Pointer的一些注意事項(xiàng)
    2024-01-01
  • Golang學(xué)習(xí)之反射機(jī)制的用法詳解

    Golang學(xué)習(xí)之反射機(jī)制的用法詳解

    反射的本質(zhì)就是在程序運(yùn)行的時(shí)候,獲取對(duì)象的類(lèi)型信息和內(nèi)存結(jié)語(yǔ)構(gòu),反射是把雙刃劍,功能強(qiáng)大但可讀性差。本文將詳細(xì)講講Golang中的反射機(jī)制,感興趣的可以了解一下
    2022-06-06

最新評(píng)論

高平市| 平乐县| 河津市| 兴城市| 九龙坡区| 玉山县| 揭东县| 江门市| 玉山县| 怀柔区| 噶尔县| 钟祥市| 伊吾县| 舟山市| 中西区| 基隆市| 玉门市| 阿城市| 兰州市| 滦平县| 成武县| 陇川县| 琼海市| 泸定县| 海宁市| 马龙县| 叙永县| 江油市| 宁德市| 宁乡县| 梨树县| 富阳市| 商河县| 横峰县| 吴旗县| 万全县| 比如县| 山东省| 寿宁县| 德清县| 梧州市|