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