首页 > 编程笔记 > Go语言笔记

Go语言空接口用法详解

空接口是指定义接口的时候,接口中没有设置任何方法。在6.3.3节已简单讲述了空接口的使用方法,本节将深入讲述如何使用空接口。

空接口表示没有任何约束,空接口是接口类型的特殊形式,空接口没有设置任何方法,任何数据类型的变量都可以使用空接口。从实现角度分析,任何数据都符合空接口的要求。空接口可以保存任意数据,也可以从空接口中取出数据。

比如使用空接口保存字符串、整型、布尔型等基础数据类型,示例如下:
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

相关文章