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

一文帶你了解Go語言中接口的使用

 更新時間:2022年12月04日 08:49:54   作者:陳明勇  
這篇文章主要和大家分享一下Go語言中的接口的使用,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的小伙伴可以參考一下

接口

Go 語言中,接口是一種抽象的類型,是一組方法的集合。接口存在的目的是定義規(guī)范,而規(guī)范的細節(jié)由其他對象去實現(xiàn)。我們來看一個例子:

import "fmt"

type Person struct {
    Name string
}

func main() {
    person := Person{Name: "cmy"}
    fmt.Println(person) // {cmy}
}

上述代碼定義了結構體 Personmain 函數(shù)創(chuàng)建了此結構體的變量 person,然后通過 fmt 包里的 Println 函數(shù)打印這個結構體,打印結果為 {cmy}。在此基礎上,我們改造一下代碼:

import "fmt"

type Person struct {
    Name string
}

func (p Person) String() string {
    return fmt.Sprintf("name: %s", p.Name)
}

func main() {
    person := Person{Name: "cmy"}
    fmt.Println(person) // name: cmy
}

新改造的代碼里為結構體 Person 添加一個結構體方法 String() string,方法的返回結果是對 name 進行格式化,我們再打印一下結構體,觀察結果發(fā)現(xiàn)是 String() 方法返回的值,而不是 {cmy}。 為什么是這樣呢?這是因為 fmt.Println(T) 函數(shù)的實現(xiàn)細節(jié)里,會對結構體進行判斷,如果結構體實現(xiàn)了 Stringer 接口,則會直接打印 String() 方法的返回值。以下是 Stringer 接口的代碼:

type Stringer interface {
    String() string
}

結構體實現(xiàn)了這個接口,也就意味著遵守這個接口所定義的規(guī)范,fmt.Println(T) 函數(shù)發(fā)現(xiàn)結構體有這個規(guī)范,因此就會根據(jù)規(guī)范來打印信息?;?Stringer 接口,我們來看看接口的語法格式:

type XXX interface {
    // methods
}

1、type

接口的聲明,必須以 type 關鍵字開頭。

2、接口名

推薦駝峰式命名法,首字母大寫的方法名可以在包外訪問,小寫的只能在包內訪問。

3、interface

接口的標識。

4、接口體

大括號里面聲明規(guī)范,也就是聲明方法,方法必須具有名字。

接口的實現(xiàn)

Go 語言里,接口的實現(xiàn)不是基于接口,而是基于方法。如果一個自定義類型擁有了某個接口的所有方法,那么這個自定義類型就實現(xiàn)這個接口。接口的實現(xiàn)在上述的例子中有所體現(xiàn),Person 結構體定義了 String() string 方法,擁有了 Stringer 接口的所有方法,因此實現(xiàn)了 Stringer 接口。

一個自定義類型可以實現(xiàn)多個接口

type A interface {
        a()
}

type B interface {
        b()
}
type Person struct {
        Name string
}

func (p Person) a() {
}

func (p Person) b() {
}

A 接口聲明了 a 方法, B 接口聲明了 b 方法,Person 結構體定義了 ab 兩個方法,因此 Person 結構體實現(xiàn)了 AB 兩個接口。

接口類型變量

一旦接口被定義,它就可以用于聲明變量。

import "fmt"

type A interface {
}

func main() {
    var a A
    fmt.Println(a) // <nil>
}

如果只聲明接口變量,不初始化,變量的值默認為 nil,因為接口類型實際上是一個指針。若為接口賦初值,需要選擇一個合法的值,即被賦值的基類必須實現(xiàn)這個接口。

空接口

Go 語言里面可以認為所有類型實現(xiàn)了空接口,因為空接口沒有任何的方法。

import "fmt"

type EmptyInterface interface {
}

func main() {
    var a EmptyInterface = 1
    var b EmptyInterface = true
    var c EmptyInterface = "hello"
    var d EmptyInterface = 3.14
    var e EmptyInterface = 'c'
    fmt.Println(a, b, c, d, e) // 1 true hello 3.14 99
}

所有類型都實現(xiàn)空接口,因此空接口變量可以被賦初值為任意類型的值或變量。

類型斷言

Go 語言支持類型斷言操作,通過這個操作,可以還原接口變量的右值(被賦的初值)。類型斷言的語法形式通常為:

v, ok := a.(T)

如果斷言成功,那么 v 的值為接口變量的值,ok 的值為 true;如果斷言失敗,v 的值為 T 類型的零值,ok 的值為 false。

類型斷言變種 type switch

通過 type switch 的方式,可以判斷接口變量屬于哪種動態(tài)類型。

import "fmt"

type EmptyInterface interface {
}

func main() {
    var a EmptyInterface = 1
    switch a.(type) {
    case string:
	fmt.Println("a 的右值類型為 string")
    case int:
	fmt.Println("a 的右值類型為 int")
    case bool:
	fmt.Println("a 的右值類型為 bool")
    case float64:
	fmt.Println("a 的右值類型為 float64")
    }
}

小結

本文先是對接口的定義進行介紹,然后通過一個例子,了解了接口其中的一個應用場景和引出接口的語法格式以及實現(xiàn)的方法,然后介紹了空接口的特點和類型斷言,最后介紹了變種的類型斷言 type switch 的應用例子。

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

相關文章

  • Go設計模式原型模式考查點及使用詳解

    Go設計模式原型模式考查點及使用詳解

    這篇文章主要為大家介紹了Go設計模式原型模式考查點及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Go編寫定時器與定時任務詳解(附第三方庫gocron用法)

    Go編寫定時器與定時任務詳解(附第三方庫gocron用法)

    當需要每天執(zhí)行定時任務的時候就需要定時器來處理了,周期任務,倒計時任務,定點任務等,下面這篇文章主要給大家介紹了關于Go編寫定時器與定時任務的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Go實現(xiàn)一個輕量級并發(fā)任務調度器(支持限速)

    Go實現(xiàn)一個輕量級并發(fā)任務調度器(支持限速)

    本文主要介紹了Go實現(xiàn)一個輕量級并發(fā)任務調度器(支持限速),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • Go語言中hot path的作用

    Go語言中hot path的作用

    熱路徑指的是經(jīng)常執(zhí)行的性能敏感的代碼路徑,優(yōu)化這些路徑可以顯著提高應用性能,通過工具如pprof進行性能分析,識別和優(yōu)化熱路徑,能有效提升系統(tǒng)的響應能力和可靠性
    2024-10-10
  • GO語言中的方法值和方法表達式的使用方法詳解

    GO語言中的方法值和方法表達式的使用方法詳解

    這篇文章主要介紹了GO的方法值和方法表達式的使用方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • GoLang內存模型詳細講解

    GoLang內存模型詳細講解

    go官方介紹go內存模型的時候說:探究在什么條件下,goroutine 在讀取一個變量的值的時,能夠看到其它 goroutine 對這個變量進行的寫的結果,Go內存模型規(guī)定了一些條件,在這些條件下,在一個goroutine中讀取變量返回的值能夠確保是另一個goroutine中對該變量寫入的值
    2022-12-12
  • Go?Singleflight導致死鎖問題解決分析

    Go?Singleflight導致死鎖問題解決分析

    這篇文章主要為大家介紹了Go?Singleflight導致死鎖問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • golang?使用chromedp獲取頁面請求日志network

    golang?使用chromedp獲取頁面請求日志network

    這篇文章主要為大家介紹了golang?使用chromedp獲取頁面請求日志network方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Go語言中io.Reader和io.Writer的詳解與實現(xiàn)

    Go語言中io.Reader和io.Writer的詳解與實現(xiàn)

    在Go語言的實際編程中,幾乎所有的數(shù)據(jù)結構都圍繞接口展開,接口是Go語言中所有數(shù)據(jù)結構的核心。在使用Go語言的過程中,無論你是實現(xiàn)web應用程序,還是控制臺輸入輸出,又或者是網(wǎng)絡操作,不可避免的會遇到IO操作,使用到io.Reader和io.Writer接口。下面來詳細看看。
    2016-09-09
  • golang接口實現(xiàn)調用修改(值接收者指針接收者)場景詳解

    golang接口實現(xiàn)調用修改(值接收者指針接收者)場景詳解

    這篇文章主要為大家介紹了golang接口實現(xiàn)調用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論

金秀| 始兴县| 平塘县| 贺兰县| 从化市| 乌兰察布市| 叶城县| 苏州市| 青岛市| 类乌齐县| 永靖县| 容城县| 信丰县| 偃师市| 博白县| 华宁县| 汉源县| 乐山市| 从化市| 万年县| 阜平县| 普兰县| 琼结县| 临颍县| 乌拉特中旗| 华蓥市| 晋州市| 茂名市| 台东市| 四会市| 嘉义市| 永平县| 建昌县| 信宜市| 蒙自县| 恩平市| 会东县| 峨边| 建瓯市| 桑日县| 西贡区|