zoukankan      html  css  js  c++  java
  • Go语言学习之空接口

    什么是空接口?

    空接口是特殊形式的接口类型,普通接口都有方法,而空接口没有定义任何方法

    type empty_iface interface {
    }

    每一个接口都包含两个属性,一个是值,一个是类型

    而对于空接口来说,这两者都是nil,可以使用fmt验证一下

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var i interface{}
        fmt.Printf("type: %T, value: %v", i, i)
    }

    输出如下

    type: <nil>, value: <nil>

    如何使用空接口

    第一、通常我们会直接使用interface{}作为类型声明一个实例,而这个实例是可以承载任何类型的值

    package main
    
    import (
        "fmt"
    )
    
    func main()  {
        // 声明一个空接口实例
        var i interface{}
    
        // 存 int 没有问题
        i = 1
        fmt.Println(i)
    
        // 存字符串也没有问题
        i = "hello"
        fmt.Println(i)
    
        // 存布尔值也没有问题
        i = false
        fmt.Println(i)
    }

    第二、如果你想让你的函数可以接收任意类型的值,也可以使用空接口.

    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)
    }
    ########结果#############
    10
    hello
    true

    第三、可以接收任意值类型示例

    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)
    }

    第四、你也可以定义一个接收任意类型的array、slice、map、struck,例如下面定义一个切片

    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)
        }
    }

    空接口要避免的坑

    当你使用空接口来接口任意类型的参数时,它的静态类型是interface{},但动态类型(是int、string还是其它)我们不知道,因此需要使用类型断言

    package main
    
    import (
        "fmt"
    )
    
    func myfunc(i interface{})  {
    
        switch i.(type) {
        case int:
            fmt.Println("参数的类型是 int")
        case string:
            fmt.Println("参数的类型是 string")
        }
    }
    
    func main() {
        a := 10
        b := "hello"
        myfunc(a)
        myfunc(b)
    }

    输出如下

    参数的类型是 int
    参数的类型是 string
  • 相关阅读:
    SQLHELPER C#
    SQL存储过程实例
    gridview css 样式及分页
    触发器
    MSsql存储过程
    解决在pc上用apk downloader插件下载谷歌play商店android应用出现的ssl错误
    VBScript输出显示双引号
    asp课堂更改读写权限值的实现
    1421. Credit Operations 夜
    sdut 1944 Flash Mob 夜
  • 原文地址:https://www.cnblogs.com/chadiandianwenrou/p/13889974.html
Copyright © 2011-2022 走看看