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

Golang接口的定義與空接口及斷言的使用示例

 更新時間:2023年04月11日 11:19:04   作者:富士康質(zhì)檢員張全蛋  
在?Golang?中,接口是一種類型,它是由一組方法簽名組成的抽象集合。這篇文章主要為大家介紹了Golang接口的具體使用,希望對大家有所幫助,空接口是特殊形式的接口類型,普通的接口都有方法,而空接口沒有定義任何方法口,也因此,我們可以說所有類型都至少實現(xiàn)了空接口

1. Golang中的接口

在Go語言中接口(interface)是一種類型,一種抽象的類型。

接口(interface)定義了一個對象的行為規(guī)范, 只定義規(guī)范不實現(xiàn) ,由具體的對象來實現(xiàn)規(guī)范的細節(jié) 。

實現(xiàn)接口的條件:

一個對象只要全部實現(xiàn)了接口中的方法 ,那么就實現(xiàn)了這個接口。換句話說,接口就是一個需要實現(xiàn)的方法列表。

2. 為什么要使用接口

下面的代碼中定義了貓和狗,然后它們都會叫,你會發(fā)現(xiàn)main函數(shù)中明顯有重復(fù)的代碼

如果我們后續(xù)再加上豬、青蛙等動物的話,我們的代碼還會一直重復(fù)下去

那我們能不能把它們當成“能叫的動物”來處理呢?

type Cat struct {
  Name string
}
func (c Cat) Say() string { 
  return c.Name + ":喵喵喵" 
}
type Dog struct {
  Name string
}
func (d Dog) Say() string { 
  return d.Name + ": 汪汪汪" 
}
func main() {
    c := Cat{Name: "小白貓"} // 小白貓:喵喵喵
    fmt.Println(c.Say())
    d := Dog{"阿黃"}
    fmt.Println(d.Say()) // 阿黃: 汪汪汪
}
/*
小白貓:喵喵喵
阿黃: 汪汪汪
*/

3. 定義一個Usber接口(從下往上轉(zhuǎn)換)

定義一個 Usber 接口讓 Phone 和 Computer 結(jié)構(gòu)體實現(xiàn)這個接口

//1.接口是一個規(guī)范
type Usber interface {
    getName() string
}
//2.如果接口里面有方法的話,必要要通過結(jié)構(gòu)體或者通過自定義類型實現(xiàn)這個接口
type Phone struct {
    Name string
}
type Computer struct {
    Brand string
}
func (c *Computer) getName() string {
    return c.Brand
}
//3.手機要實現(xiàn)usb接口的話必須得實現(xiàn)usb接口中的所有方法
func (p *Phone) getName() string {
    return p.Name
}
func main() {
    p := &Phone{
    Name: "華為手機",
    }
    c := &Computer{
    Brand: "聯(lián)想電腦",
    }
    var p1 Usber // golang中接口就是一個數(shù)據(jù)類型
    p1 = p // 表示手機實現(xiàn)Usb接口
    fmt.Println(p1.getName())
    //接口使用場景,處理相同類型的數(shù)據(jù)
    newName := transData(p)
    newName1 := transData(c)
    fmt.Println(newName, newName1)
    }
    func transData(usber Usber) string {
        name := usber.getName()
        return fmt.Sprintf("%s%s", name, "處理后")
}

當我們要去處理同一數(shù)據(jù)類型的時候這個數(shù)據(jù)的時候,比如貓 狗是同一類數(shù)據(jù)類型。

像k8s的deployment,pod,configmap,secretd等等這些資源的時候,它都是k8s的一個資源,在獲取列表的時候會對其做數(shù)據(jù)處理,比如要對其進行數(shù)據(jù)排序,那么只需要對這個接口進行排序就行了,不需要對每個資源都去寫一遍排序的方法,那么這樣不是很冗余嗎?

4. 空接口

1. 空接口說明

  • Golang中空接口也可以直接當做類型來使用,可以表示任意類型 (泛型概念,最大的特點)
  • Golang 中的接口可以不定義任何方法,沒有定義任何方法的接口就是空接口。
  • 空接口表示沒有任何約束,因此任何類型變量都可以實現(xiàn)空接口。
  • 空接口在實際項目中用的是非常多的,用空接口可以表示任意數(shù)據(jù)類型

2. 空接口作為函數(shù)的參數(shù)

//空接口作為函數(shù)的參數(shù)
func show(a interface{}) {
    fmt.Printf("值:%v 類型:%T\n", a, a) }
    func main() { 
    show(20) // 值:20 類型:int 
    show("你好golang") // 值:你好golang 類型:string 
    slice := []int{1, 2, 34, 4} 
    show(slice) // 值:[1 2 34 4] 類型:[]int 
    }

printf println是可以接受任何參數(shù)的,func Printf(format string , a ...interface{})可以看到這里可以接受任何空接口類型,...類似于切片類型。

func test(a int, b ...interface{}) {
    for _, v := range b {
        fmt.Printf("%v,%T \n", v, v)
    }
}
func main() {
    test(1, "a", 22, []string{"1"})
}
a,string 
22,int 
[1],[]string 

3. 切片實現(xiàn)空接口

切片和map是同一類型的元素,有了空接口,在同一個切片同一個map中就可以將任何類型的數(shù)據(jù)放進去。

func main() { 
    var slice = []interface{}{"張三", 20, true, 32.2}
    fmt.Println(slice) // [張三 20 true 32.2] 
}

4. map 的值實現(xiàn)空接口

func main() { // 空接口作為 map 值 
var studentInfo = make(map[string]interface{}) 
studentInfo["name"] = "張三" 
studentInfo["age"] = 18 studentInfo["married"] = false
fmt.Println(studentInfo) // [age:18 married:false name:張三] }

類型斷言(從上往下轉(zhuǎn)換,接口類型轉(zhuǎn)化為具體類型)

  • 一個接口的值(簡稱接口值)是由一個具體類型和具體類型的值兩部分組成的。
  • 這兩部分分別稱為接口的動態(tài)類型和動態(tài)值。(一個空接口,可以是結(jié)構(gòu)體,指針,布爾各種類型。它其實是動態(tài)的,你傳遞什么都可以,這就叫做動態(tài)類型和動態(tài)值)
  • 如果我們想要判斷空接口中值的類型,那么這個時候就可以使用類型斷言
  • 其語法格式: x.(T)

x : 表示類型為 interface{}的變量

T : 表示斷言 x 可能是的類型

斷言返回兩個值,一個是斷言是否轉(zhuǎn)化成果,一個是轉(zhuǎn)化結(jié)果,注意空接口類型是空接口類型。

    var str interface{}
    str = "hello"
    str = str + "sss"  //這樣寫是會報錯的,因為空接口類型不是字符串類型,需要斷言轉(zhuǎn)化才可以
type test1 struct {
    name string
    age  int
}
func main() {
    var t interface{}
    //未斷言前沒有結(jié)構(gòu)體的特征,需要斷言轉(zhuǎn)化為結(jié)構(gòu)體指針
    t = &test1{
        name: "hh",
        age:  12,
    }
    v, ok := t.(*test1)  //這里其實就是做了一個類型轉(zhuǎn)化,這里的類型就變?yōu)閬斫Y(jié)構(gòu)體指針類型
    if ok {
        fmt.Printf("類型:%T 值:%#v\n", v, v)
    } else {
        fmt.Println("xxx")
    }
}
類型:*main.test1 值:&main.test1{name:"hh", age:12}

轉(zhuǎn)化為具體類型之后,那么具體類型的方法是都可以去調(diào)用的,空接口是不能訪問屬性和方法的。轉(zhuǎn)化為具體的類型之后就可以訪問其屬性和方法。

值接收者和指針接收者(節(jié)省內(nèi)存)

1. 值接收者

當方法作用于值類型接收者時,Go語言會在代碼運行時將接收者的值復(fù)制一份。

在值類型接收者的方法中可以獲取接收者的成員值,但修改操作只是針對副本,無法修改接收者變量本身。

type Usb interface { 
    Start() 
    Stop() 
}
type Phone struct { 
Name string 
}
func (p Phone) Start() {
fmt.Println(p.Name, "開始工作") 
}
func (p Phone) Stop() {
fmt.Println("phone 停止") 
}
func main() { 
    phone1 := Phone{  // 一:實例化值類型 
    Name: "小米手機", 
    }
    var p1 Usb = phone1 //phone1 實現(xiàn)了 Usb 接口 phone1 是 Phone 類型 
    p1.Start() 
    
    phone2 := &Phone{ // 二:實例化指針類型 
      Name: "蘋果手機", 
    }
    var p2 Usb = phone2 //phone2 實現(xiàn)了 Usb 接口 phone2 是 *Phone 類型 
    p2.Start() //蘋果手機 開始工作 
}

2. 指針接收者

  • 指針類型的接收者由一個結(jié)構(gòu)體的指針組成
  • 由于指針的特性,調(diào)用方法時修改接收者指針的任意成員變量,在方法結(jié)束后,修改都是有效的。
  • 這種方式就十分接近于其他語言中面向?qū)ο笾械?this 或者 self 。
  • 例如我們?yōu)?Person 添加一個 SetAge 方法,來修改實例變量的年齡。

3. 指針類型接收者

使用時機

注:并不是所有情況下都希望修改數(shù)據(jù)

  • 需要修改接收者中的值
  • 接收者是拷貝代價比較大的大對象
  • 保證一致性,如果有某個方法使用了指針接收者,那么其他的方法也應(yīng)該使用指針接收者。

從使用場景上面來說,基本上都會使用指針,如果使用了第三方的包,第三方包的某些返回值它只是一個值類型,所以第三方類型返回什么類型我們就使用什么類型,針對第三方包。

到此這篇關(guān)于Golang接口的定義與空接口及斷言的使用示例的文章就介紹到這了,更多相關(guān)Golang接口的定義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang常用包使用介紹

    Golang常用包使用介紹

    標準的Go語言代碼庫中包含了大量的包,并且在安裝Go的時候多數(shù)會自動安裝到系統(tǒng)中。我們可以在$GOROOT/src/pkg目錄中查看這些包。下面簡單介紹一些我們開發(fā)中常用的包
    2022-09-09
  • 詳解Golang實現(xiàn)請求限流的幾種辦法

    詳解Golang實現(xiàn)請求限流的幾種辦法

    這篇文章主要介紹了詳解Golang實現(xiàn)請求限流的幾種辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • go語言中布隆過濾器低空間成本判斷元素是否存在方式

    go語言中布隆過濾器低空間成本判斷元素是否存在方式

    這篇文章主要為大家介紹了go語言中布隆過濾器低空間成本判斷元素是否存在方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說明

    Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說明

    這篇文章主要介紹了Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 如何使用騰訊云go sdk 查詢對象存儲中最新文件

    如何使用騰訊云go sdk 查詢對象存儲中最新文件

    這篇文章主要介紹了使用騰訊云go sdk 查詢對象存儲中最新文件,這包括如何創(chuàng)建COS客戶端,如何逐頁檢索對象列表,并如何對結(jié)果排序以找到最后更新的對象,我們還展示了如何優(yōu)化用戶體驗,通過實時進度更新和檢索多個文件來改進程序,需要的朋友可以參考下
    2024-03-03
  • RabbitMq如何做到消息的可靠性投遞

    RabbitMq如何做到消息的可靠性投遞

    現(xiàn)在的一些互聯(lián)網(wǎng)項目或者是高并發(fā)的項目中很少有沒有引入消息隊列的。 引入消息隊列可以給這個項目帶來很多的好處,這篇文章主要為大家介紹了RabbitMq如何做到消息的可靠性投遞,有需要的朋友可以借鑒參考下
    2022-12-12
  • goland中導(dǎo)包報紅和go mod問題

    goland中導(dǎo)包報紅和go mod問題

    這篇文章主要介紹了goland中導(dǎo)包報紅和go mod問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Go語言context?test源碼分析詳情

    Go語言context?test源碼分析詳情

    這篇文章主要介紹了Go語言context?test源碼分析詳情,關(guān)于context?test,測試對象是context包,測試包的包名是context_test,下面將對context?test源碼進行分析,需要的朋友可以參考一下,希望對你有所幫助
    2022-02-02
  • 詳解Go語言中rand(隨機數(shù))包的使用

    詳解Go語言中rand(隨機數(shù))包的使用

    在Golang中,有兩個包提供了rand,分別為math/rand和crypto/rand對應(yīng)兩種應(yīng)用場景。math/rand包實現(xiàn)了偽隨機數(shù)生成器。也就是生成 整形和浮點型;crypto/rand包實現(xiàn)了用于加解密的更安全的隨機數(shù)生成器。本文就來和大家詳細講講math/rand的使用
    2022-08-08
  • 分享6個Go處理字符串的技巧小結(jié)

    分享6個Go處理字符串的技巧小結(jié)

    這篇文章主要介紹了分享6個Go處理字符串的技巧小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論

五指山市| 葫芦岛市| 长顺县| 南召县| 大邑县| 扶风县| 祁连县| 邢台市| 开阳县| 和静县| 从江县| 大理市| 石城县| 韩城市| 萍乡市| 淳化县| 昌平区| 全州县| 怀来县| 乌海市| 阳朔县| 安龙县| 遵化市| 喜德县| 霍邱县| 高安市| 饶河县| 广汉市| 怀柔区| 平定县| 天气| 公主岭市| 扎兰屯市| 临海市| 永仁县| 灯塔市| 宜章县| 桑日县| 寿宁县| 万山特区| 沁源县|