Go语言空接口用法详解
空接口是指定义接口的时候,接口中没有设置任何方法。在6.3.3节已简单讲述了空接口的使用方法,本节将深入讲述如何使用空接口。
空接口表示没有任何约束,空接口是接口类型的特殊形式,空接口没有设置任何方法,任何数据类型的变量都可以使用空接口。从实现角度分析,任何数据都符合空接口的要求。空接口可以保存任意数据,也可以从空接口中取出数据。
比如使用空接口保存字符串、整型、布尔型等基础数据类型,示例如下:
切片、集合和结构体使用空接口,可以为切片元素、集合键值对或结构体成员设置任意的数据类型,比如将切片元素设为空接口,一个切片能写入不同类型的数据;集合的值(value)设为空接口,一个集合的值(value)有不同类型的数据;结构体成员设为空接口,结构体成员可以设置不同类型的数据,示例如下:
空接口除了作为切片元素、集合键值对和结构体成员的数据类型之外,还可以作为函数方法的参数或返回值,在调用的时候可以将参数或返回值设为任意数据类型,示例如下:
空接口表示没有任何约束,空接口是接口类型的特殊形式,空接口没有设置任何方法,任何数据类型的变量都可以使用空接口。从实现角度分析,任何数据都符合空接口的要求。空接口可以保存任意数据,也可以从空接口中取出数据。
比如使用空接口保存字符串、整型、布尔型等基础数据类型,示例如下:
package main
import (
"fmt"
)
// 定义空接口
type empty interface{}
func main() {
// 创建空接口变量
var e empty
fmt.Printf("空接口的数据:%v,数据类型:%T\n", e, e)
// 定义字符串变量s
s := "hello golang"
// 将字符串变量赋给空接口变量
e = s
fmt.Printf("空接口的数据:%v,数据类型:%T\n", e, e)
// 定义整型变量n
n := 120
// 将整型变量赋给空接口变量
e = n
fmt.Printf("空接口的数据:%v,数据类型:%T\n", e, e)
// 定义布尔变量b
b := true
// 将布尔变量赋给空接口变量
e = b
fmt.Printf("空接口的数据:%v,数据类型:%T\n", e, e)
}
在没有赋值的情况下,空接口变量的值和数据类型皆为空值(nil),如果对空接口变量执行赋值操作,比如将字符串变量、整型变量或布尔变量赋值给空接口变量,空接口变量的值和数据类型随着赋值过程而发生变化,如下图所示。
空接口的数据:<nil>,数据类型:<nil>
空接口的数据:hello golang,数据类型:string
空接口的数据:120,数据类型:int
空接口的数据:true,数据类型:bool
切片、集合和结构体使用空接口,可以为切片元素、集合键值对或结构体成员设置任意的数据类型,比如将切片元素设为空接口,一个切片能写入不同类型的数据;集合的值(value)设为空接口,一个集合的值(value)有不同类型的数据;结构体成员设为空接口,结构体成员可以设置不同类型的数据,示例如下:
package main
import (
"fmt"
)
func main() {
// 定义切片变量s,切片元素为空接口
// 设置切片的元素值
s := []interface{}{1, "abc", 1.32}
fmt.Printf("切片数据:%v\n", s)
// 定义集合变量m
m := map[string]interface{}{}
// 设置集合的键值对
m["name"] = "Tom"
m["age"] = 10
fmt.Printf("集合数据:%v\n", m)
// 定义匿名结构体ss
var ss struct{
name interface{}
}
// 设置结构体成员的数值
ss.name = "Mary"
fmt.Printf("结构体ss的数据:%v,数据类型:%T\n", ss.name, ss.name)
ss.name = 10
fmt.Printf("结构体ss的数据:%v,数据类型:%T\n", ss.name, ss.name)
}
我们将切片元素、集合的值(value)和结构体成员设为空接口类型,在赋值过程中可以设置任意数据类型,使代码编写变得灵活和方便,省去了数据类型的转换过程,运行结果为:
切片数据:[1 abc 1.32]
集合数据:map[age:10 name:Tom]
结构体ss的数据:Mary,数据类型:string
结构体ss的数据:10,数据类型:int
空接口除了作为切片元素、集合键值对和结构体成员的数据类型之外,还可以作为函数方法的参数或返回值,在调用的时候可以将参数或返回值设为任意数据类型,示例如下:
package main
import (
"fmt"
)
func get_data(d interface{}) interface{} {
fmt.Printf("参数值为:%v,数据类型:%T\n", d, d)
return d
}
func main() {
d := get_data("Tom")
fmt.Printf("返回值为:%v,数据类型:%T\n", d, d)
d1 := get_data(666)
fmt.Printf("返回值为:%v,数据类型:%T\n", d1, d1)
}
运行代码,结果为:
参数值为:Tom,数据类型:string
返回值为:Tom,数据类型:string
参数值为:666,数据类型:int
返回值为:666,数据类型:int
ICP备案:
公安联网备案: