主頁 > 知識(shí)庫 > Go 語言中的空接口(推薦)

Go 語言中的空接口(推薦)

熱門標(biāo)簽:濮陽自動(dòng)外呼系統(tǒng)代理 賺地圖標(biāo)注的錢犯法嗎 地圖標(biāo)注測試 福州鐵通自動(dòng)外呼系統(tǒng) 澳門防封電銷卡 智能電銷機(jī)器人營銷 烏魯木齊人工電銷機(jī)器人系統(tǒng) 長沙ai機(jī)器人電銷 廣東語音外呼系統(tǒng)供應(yīng)商

在自己學(xué)習(xí) Golang 的這段時(shí)間里,我寫了詳細(xì)的學(xué)習(xí)筆記放在我的個(gè)人微信公眾號 《Go編程時(shí)光》,對于 Go 語言,我也算是個(gè)初學(xué)者,因此寫的東西應(yīng)該會(huì)比較適合剛接觸的同學(xué),如果你也是剛學(xué)習(xí) Go 語言,不防關(guān)注一下,一起學(xué)習(xí),一起成長。

我的在線博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime

1. 什么是空接口?

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

type empty_iface interface {
}

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

而對于空接口來說,這兩者都是 nil,可以使用 fmt 來驗(yàn)證一下

package main

import (
	"fmt"
)

func main() {
	var i interface{}
	fmt.Printf("type: %T, value: %v", i, i)
}

輸出如下

type: nil>, value: nil>

2. 如何使用空接口?

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

package main

import (
	"fmt"
)

func main() {
	// 聲明一個(gè)空接口實(shí)例
	var i interface{}

	// 存 int 沒有問題
	i = 1
	fmt.Println(i)

	// 存字符串也沒有問題
	i = "hello"
	fmt.Println(i)

	// 存布爾值也沒有問題
	i = false
	fmt.Println(i)
}

第二,如果想讓你的函數(shù)可以接收任意類型的值 ,也可以使用空接口

接收一個(gè)任意類型的值 示例

package main

import (
	"fmt"
)

func myfunc(iface interface{}){
	fmt.Println(iface)
}

func main() {
	a := 10
	b := "hello"
	c := true

	myfunc(a)
	myfunc(b)
	myfunc(c)
}

接收任意個(gè)任意類型的值 示例

package main

import (
	"fmt"
)

func myfunc(ifaces ...interface{}){
	for _,iface := range ifaces{
		fmt.Println(iface)
	}
}

func main() {
	a := 10
	b := "hello"
	c := true

	myfunc(a, b, c)
}

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

package main

import "fmt"

func main() {
 any := make([]interface{}, 5)
 any[0] = 11
 any[1] = "hello world"
 any[2] = []int{11, 22, 33, 44}
 for _, value := range any {
 fmt.Println(value)
 }
}

3. 空接口幾個(gè)要注意的坑

坑1:空接口可以承載任意值,但不代表任意類型就可以承接空接口類型的值

從實(shí)現(xiàn)的角度看,任何類型的值都滿足空接口。因此空接口類型可以保存任何值,也可以從空接口中取出原值。

但要是你把一個(gè)空接口類型的對象,再賦值給一個(gè)固定類型(比如 int, string等類型)的對象賦值,是會(huì)報(bào)錯(cuò)的。

package main

func main() {
	// 聲明a變量, 類型int, 初始值為1
	var a int = 1

	// 聲明i變量, 類型為interface{}, 初始值為a, 此時(shí)i的值變?yōu)?
	var i interface{} = a

	// 聲明b變量, 嘗試賦值i
	var b int = i
}

這個(gè)報(bào)錯(cuò),它就好比可以放進(jìn)行禮箱的東西,肯定能放到集裝箱里,但是反過來,能放到集裝箱的東西就不一定能放到行禮箱了,在 Go 里就直接禁止了這種反向操作。(聲明:底層原理肯定還另有其因,但對于新手來說,這樣解釋也許會(huì)容易理解一些。)

.\main.go:11:6: cannot use i (type interface {}) as type int in assignment: need type assertion

坑2::當(dāng)空接口承載數(shù)組和切片后,該對象無法再進(jìn)行切片

package main

import "fmt"

func main() {
	sli := []int{2, 3, 5, 7, 11, 13}

	var i interface{}
	i = sli

	g := i[1:3]
	fmt.Println(g)
}

執(zhí)行會(huì)報(bào)錯(cuò)。

.\main.go:11:8: cannot slice i (type interface {})

坑3:當(dāng)你使用空接口來接收任意類型的參數(shù)時(shí),它的靜態(tài)類型是 interface{},但動(dòng)態(tài)類型(是 int,string 還是其他類型)我們并不知道,因此需要使用類型斷言。

package main

import (
	"fmt"
)

func myfunc(i interface{}) {

	switch i.(type) {
	case int:
		fmt.Println("參數(shù)的類型是 int")
	case string:
		fmt.Println("參數(shù)的類型是 string")
	}
}

func main() {
	a := 10
	b := "hello"
	myfunc(a)
	myfunc(b)
}

輸出如下

參數(shù)的類型是 int
參數(shù)的類型是 string

總結(jié)

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

您可能感興趣的文章:
  • django API 中接口的互相調(diào)用實(shí)例
  • Django 自動(dòng)生成api接口文檔教程
  • python Django編寫接口并用Jmeter測試的方法
  • Django如何開發(fā)簡單的查詢接口詳解
  • 使用Django開發(fā)簡單接口實(shí)現(xiàn)文章增刪改查
  • golang中interface接口的深度解析
  • 淺談Go語言中的結(jié)構(gòu)體struct & 接口Interface & 反射
  • Go語言接口定義與用法示例
  • 分析Go語言接口的設(shè)計(jì)原則

標(biāo)簽:德州 貴陽 阿克蘇 西雙版納 廣西 調(diào)研邀請 太原 慶陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go 語言中的空接口(推薦)》,本文關(guān)鍵詞  語言,中的,空,接口,推薦,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go 語言中的空接口(推薦)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Go 語言中的空接口(推薦)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章