在自己學(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ì)原則