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

Golang空接口與類型斷言的實現

 更新時間:2022年03月25日 09:10:21   作者:藍色記憶  
本文主要介紹了Golang空接口與類型斷言的實現,文中根據實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下

空接口

定義

空接口是特殊形式的接口類型,普通的接口都有方法,而空接口沒有定義任何方法口,也因此,我們可以說所有類型都至少實現了空接口。

type test interface {
}

每一個接口都包含兩個屬性,一個是值,一個是類型。

var i interface{}
fmt.Printf("類型:%T----值:%v\n", i, i) //類型:<nil>----值:<nil>

可見對于空接口來說,這兩者都是 nil

使用場景

第一,通常我們會直接使用 interface{} 作為類型聲明一個實例,而這個實例可以承載任意類型的值。

func main() {
	var i interface{}

	i = 100
	fmt.Println(i) //100

	i = "yif"
	fmt.Println(i) //yif

	i = 3.14
	fmt.Println(i) //3.14

	i = false
	fmt.Println(i) //false
}

第二,如果想讓你的函數可以接收任意類型的值 ,也可以使用空接口。如下代碼都正常打印:

func main() {
	i := 100
	s := "yif"
	f := 3.14

	test(i)
	test(s)
	test(f)
}

func test(i interface{}) {
	fmt.Println(i)
}

上面寫法有點麻煩,可以使用可變參數的函數。如下:

func main() {
	i := 100
	s := "yif"
	f := 3.14

	test(i, s, f)
}

func test(res ...interface{}) {
	fmt.Println(res) //res是切片
	for k, v := range res {
		fmt.Println(k, v)
	}
}

結果:

D:\workspace\go\src\test>go run main.go
[100 yif 3.14]
0 100
1 yif
2 3.14 

第三,你也定義一個可以接收任意類型的 array、slice、map、strcut,例如這邊定義一個切片

func main() {
	sli := make([]interface{}, 4)
	sli[0] = 100
	sli[1] = "yif"
	sli[2] = []int{1, 2, 3}
	sli[3] = [...]int{5, 6, 7}
	fmt.Println(sli)
	for k, v := range sli {
		fmt.Println(k, v)
	}
}

結果:

D:\workspace\go\src\test>go run main.go
[100 yif [1 2 3] [5 6 7]]
0 100
1 yif
2 [1 2 3]
3 [5 6 7] 

空接口幾個要注意的坑

**第一,**空接口可以承載任意值,但不代表任意類型就可以承接空接口類型的值

空接口類型可以保存任何值,也可以從空接口中取出原值。

但要是你把一個空接口類型的對象,再賦值給一個固定類型(比如 int, string等類型)的對象賦值,是會報錯的。

var i interface{} = 100
var t int = i // cannot use i (type interface {}) as type int in assignment: need type assertion

但是你使用短變量聲明,是可以的:

var i interface{} = 100
t := i
fmt.Println(t) //100

因為編譯器會根據等號右邊的值來推導變量的類型完成初始化。

**第二:**當空接口承載數組和切片后,該對象無法再進行切片

sli := []int{1, 2, 3, 4}
var i interface{}
i = sli
fmt.Println(i[1:2]) //cannot slice i (type interface {})

類型斷言

類型斷言(Type Assertion)是一個使用在接口值上的操作,用于檢查接口類型變量所持有的值是否實現了期望的接口或者具體的類型

類型斷言,僅能對靜態(tài)類型為空接口(interface{})的對象進行斷言,否則會拋出錯誤

Go語言中類型斷言的兩種語法

在Go語言中類型斷言的第一種語法格式如下:

t := i.(T)

這個表達式可以斷言一個接口對象(i)里不是 nil,并且接口對象(i)存儲的值的類型是 T,如果斷言成功,就會返回值給 t,如果斷言失敗,就會觸發(fā) panic。

func main() {
	var i interface{} = 100
	t := i.(int)
	fmt.Println(t) //100
	
	fmt.Println("------------------------------------")

	s := i.(string)
	fmt.Println(s)
}

結果【執(zhí)行第二次斷言的時候失敗了,并且觸發(fā)了 panic】:

D:\workspace\go\src\test>go run main.go
100
------------------------------------
panic: interface conversion: interface {} is int, not string

goroutine 1 [running]:
main.main()
        D:/workspace/go/src/test/main.go:32 +0x10e
exit status 2 

如果要斷言的接口值是 nil,那我們來看看也是不是也如預期一樣會觸發(fā)panic

var i interface{}
var _ = i.(interface{})

結果:

D:\workspace\go\src\test>go run main.go
panic: interface conversion: interface is nil, not interface {}

goroutine 1 [running]:
main.main()
        D:/workspace/go/src/test/main.go:27 +0x34
exit status 2 

在Go語言中類型斷言的另一種語法格式如下:

t, ok:= i.(T)

和上面一樣,這個表達式也是可以斷言一個接口對象(i)里不是 nil,并且接口對象(i)存儲的值的類型是 T,如果斷言成功,就會返回其類型給 t,并且此時 ok 的值 為 true,表示斷言成功。

如果接口值的類型,并不是我們所斷言的 T,就會斷言失敗,但和第一種表達式不同的事,這個不會觸發(fā) panic,而是將 ok 的值設為 false ,表示斷言失敗,此時t 為 T 的零值。

func main() {
    var i interface{} = 10
    t1, ok := i.(int)
    fmt.Printf("%d-%t\n", t1, ok)

    fmt.Println("=====分隔線1=====")

    t2, ok := i.(string)
    fmt.Printf("%s-%t\n", t2, ok)

    fmt.Println("=====分隔線2=====")

    var k interface{} // nil
    t3, ok := k.(interface{})
    fmt.Println(t3, "-", ok)

    fmt.Println("=====分隔線3=====")
    k = 10
    t4, ok := k.(interface{})
    fmt.Printf("%d-%t\n", t4, ok)

    t5, ok := k.(int)
    fmt.Printf("%d-%t\n", t5, ok)
}

結果【運行后輸出如下,可以發(fā)現在執(zhí)行第二次斷言的時候,雖然失敗了,但并沒有觸發(fā)了 panic】:

D:\workspace\go\src\test>go run main.go
10-true
=====分隔線1=====
-false
=====分隔線2=====
<nil> - false
=====分隔線3=====
10-true
10-true 

上面這段輸出,你要注意的是第二個斷言的輸出在-false 之前并不是有沒有輸出任何 t2 的值,而是由于斷言失敗,所以 t2 得到的是 string 的零值也是 "" ,它是零長度的,所以你看不到其輸出。

類型斷言配合 switch 使用

如果需要區(qū)分多種類型,可以使用 type switch 斷言。

func main() {
	test(100)
	test("yif")
	test(3.14)
	
	var i interface{} //nil
	test(i)
	
	test(nil)
}

func test(i interface{}) {
	switch r := i.(type) {
	case int:
		fmt.Println(r, "是int型")
	case string:
		fmt.Println(r, "是字符串")
	case nil:
		fmt.Println(r, "是nil")
	default:
		fmt.Println("沒有結果!")
	}
}

結果:

D:\workspace\go\src\test>go run main.go
100 是int型
yif 是字符串
沒有結果!
<nil> 是nil
<nil> 是nil

 到此這篇關于Golang空接口與類型斷言的實現的文章就介紹到這了,更多相關Golang空接口與類型斷言內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 多階段構建優(yōu)化Go?程序Docker鏡像

    多階段構建優(yōu)化Go?程序Docker鏡像

    這篇文章主要為大家介紹了多階段構建優(yōu)化Go?程序Docker鏡像,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 在go文件服務器加入http.StripPrefix的用途介紹

    在go文件服務器加入http.StripPrefix的用途介紹

    這篇文章主要介紹了在go文件服務器加入http.StripPrefix的用途介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 實時通信的服務器推送機制 EventSource(SSE) 簡介附go實現示例代碼

    實時通信的服務器推送機制 EventSource(SSE) 簡介附go實現示例代碼

    EventSource是一種非常有用的 API,適用于許多實時應用場景,它提供了一種簡單而可靠的方式來建立服務器推送連接,并實現實時更新和通知,這篇文章主要介紹了實時通信的服務器推送機制 EventSource(SSE)簡介附go實現示例,需要的朋友可以參考下
    2024-03-03
  • go語言題解LeetCode1128等價多米諾骨牌對的數量

    go語言題解LeetCode1128等價多米諾骨牌對的數量

    這篇文章主要為大家介紹了go語言題解LeetCode1128等價多米諾骨牌對的數量示例詳解,
    2022-12-12
  • 如何通過Golang的container/list實現LRU緩存算法

    如何通過Golang的container/list實現LRU緩存算法

    文章介紹了Go語言中container/list包實現的雙向鏈表,并探討了如何使用鏈表實現LRU緩存,LRU緩存通過維護一個雙向鏈表來管理數據,確保在插入和刪除操作時能夠以O(1)的平均時間復雜度運行,提供了鏈表的操作和使用場景,并附帶了實現LRU緩存的代碼示例,感興趣的朋友一起看看吧
    2025-03-03
  • golang sql語句超時控制方案及原理

    golang sql語句超時控制方案及原理

    一般應用程序在執(zhí)行一條sql語句時,都會給這條sql設置一個超時時間,本文主要介紹了golang sql語句超時控制方案及原理,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • golang實現并發(fā)控制的方法和技巧

    golang實現并發(fā)控制的方法和技巧

    golang 是一門支持并發(fā)的編程語言,它提供了 goroutine 和 channel 等強大的特性,讓我們可以輕松地創(chuàng)建和管理多個執(zhí)行單元,實現高效的任務處理,在本文中,我們將介紹一些 golang 的并發(fā)控制的方法和技巧,希望對你有所幫助
    2024-03-03
  • go語言中反射機制的三種使用場景

    go語言中反射機制的三種使用場景

    本文主要介紹了go語言中反射機制的三種使用場景,包括JSON解析、ORM框架和接口適配,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • Go使用Protocol?Buffers在數據序列化的優(yōu)勢示例詳解

    Go使用Protocol?Buffers在數據序列化的優(yōu)勢示例詳解

    這篇文章主要為大家介紹了Go使用Protocol?Buffers在數據序列化的優(yōu)勢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Go strconv包實現字符串和基本數據類型轉換的實例詳解

    Go strconv包實現字符串和基本數據類型轉換的實例詳解

    在Go語言(Golang)的編程實踐中,strconv包是一個非常重要的標準庫,它提供了在基本數據類型(如整型、浮點型、布爾型)和字符串之間的轉換功能,本文給大家介紹了關于Go語言字符串轉換strconv,需要的朋友可以參考下
    2024-09-09

最新評論

搜索| 蛟河市| 襄汾县| 崇阳县| 青冈县| 泰兴市| 喀喇沁旗| 凉山| 玉林市| 历史| 聊城市| 新晃| 大同县| 郑州市| 孟连| 仪征市| 明水县| 永春县| 开远市| 张北县| 青浦区| 江阴市| 法库县| 襄垣县| 平乡县| 临潭县| 河津市| 安岳县| 龙陵县| 龙岩市| 济阳县| 肥东县| 台中县| 临沧市| 鄂托克旗| 澳门| 中方县| 潢川县| 交城县| 镇康县| 鄂托克旗|