空接口
空接口是指沒有定義任何接口方法的接口。沒有定義任何接口方法,意味著Go中的任意對象都可以實現空接口(因為沒方法需要實現),任意對象都可以保存到空接口實例變量中。
空接口的定義方式:
1
2
type empty_int interface {
}
通常會簡寫為type empty_int interface{}。
更常見的,會直接使用interface{}作為一種類型,表示空接口。例如:
1
2
// 聲明一個空接口實例
var i interface{}
再比如函數使用空接口類型參數:
func myfunc(i interface{})
在Go中很多地方都使用空接口類型的參數,用的最多的fmt中的Print類方法:
1
2
$ go doc fmt Println
func Println(a 。..interface{}) (n int, err error)
空接口數據結構
可以定義一個空接口類型的array、slice、map、struct等,這樣它們就可以用來存放任意類型的對象,因為任意類型都實現了空接口。
例如,創建一個空接口的slice:
1
2
3
4
5
6
7
8
9
10
11
12
13
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)
}
}
輸出結果:
1
2
3
4
5
11
hello world
[11 22 33 44]
《nil》
《nil》
顯然,通過空接口類型,Go也能像其它動態語言一樣,在數據結構中存儲任意類型的數據。
再比如,某個struct中,如果有一個字段想存儲任意類型的數據,就可以將這個字段的類型設置為空接口:
1
2
3
4
type my_struct struct {
anything interface{}
anythings []interface{}
}
拷貝數據結構到空接口數據結構
前面解釋了任意類型的對象都能賦值給空接口實例。
1
2
3
var any interface{}
any = “hello world”
any = 11
空接口是一種接口,它是一種指針類型的數據類型,雖然不嚴謹,但它確實保存了兩個指針,一個是對象的類型(或iTable),一個是對象的值。所以上面的賦值過程是讓空接口any保存各個數據對象的類型和對象的值。
換一種角度考慮,空接口有自己的內存布局方式:兩個指針,占用兩個機器字長。
Golang給的一個經典的示例:將某個slice中的數據拷貝到空接口slice中將報錯。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main
import “fmt”
func main() {
testSlice := []int{11,22,33,44}
// 成功拷貝
var newSlice []int
newSlice = testSlice
fmt.Println(newSlice)
// 拷貝失敗
var any []interface{}
any = testSlice
fmt.Println(any)
}
這是因為每個空接口的內存布局都占用兩個機器字長的內容。對于長度為N的空接口slice來說,它的每個元素都是以2機器字長為單元的連續空間,共占用N*2個機器字長的空間。
而普通的slice,例如上面的testSlice,它的每個元素是int類型的,int類型的內存布局和空接口不一樣。
這些對象的內存布局在編譯期間就已經確定好了,所以沒法直接將不同內存布局的數據結構進行拷貝。
要想完成期待的拷貝,可以使用for-range的方式,將testSlice中的每個元素賦值給空接口slice的空接口元素:也就是一個個的空接口實例。
1
2
3
4
var any []interface{}
for _,value := range testSlice{
any = append(any,value)
}
這樣,空接口Slice中的每個空接口實例都指向更底層的各個數據對象。而不是像前面錯誤的拷貝方式:每個空接口元素想要當作這些數據對象。
不僅空接口的Slice如此,其它包含空接口的數據結構,也都類似。
審核編輯:黃飛
-
接口
+關注
關注
33文章
8694瀏覽量
151925 -
數據類型
+關注
關注
0文章
236瀏覽量
13663
原文標題:空接口
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論