interface的万能类型

  • interface可以作为万能类型,当为interface{}时表示万能类型,即空接口。
  • GO中原生自带的数据类型如:int、string、float32、float64、struct..,底层都已经实现了interface{}

    • 可以使用interface{}类型引用任意的数据类型(基本类型或者创建的struct)。
  • 有点类似于Python中的Object,Python中所有的类都继承了Object类,可以调用Object的所有方法和属性。

当函数需要接收多种数据类型作为参数时,可以将参数的数据类型设置成interface{}万能类型,例如以下代码:

package main

import "fmt"

// interface{}是万能数据类型
func myFunc(arg interface{}) { //arg参数表示万能类型
    fmt.Println("myFunc is called ...")
    fmt.Println(arg)
}

type Book struct { // 声明一个结构体
    author string
}

func main() {
    book := Book{"Golang"}

    myFunc(book)
    myFunc(100)
    myFunc("abc")
    myFunc(3.14)
}
  • 5-9行声明myFunc函数,参数为万能类型
  • 11-13行声明一个结构体Book
  • 18-21行分别将结构体、整型、字符串型、浮点型作为参数传入函数中

运行结果:
image.png
可以看到万能类型可以接收任意数据类型参数,这样通过万能类型就可以接收多种数据类型,类似Java中的泛型。

interface{}的断言机制

上面的例子中声明的函数,通过万能类型可以接收任意数据类型的参数,那么interface{}该如何区分此时引用的底层数据类型到底是什么?

答:Golang提供了类型断言机制来区分interface{}引用的底层数据类型。

断言的使用方法:[参数].([需要判断的数据类型])
其返回值是本身数据类型判断的布尔值

package main

import "fmt"

// interface{}是万能数据类型
func myFunc(arg interface{}) { //arg参数表示万能类型
    fmt.Println("myFunc is called ...")
    fmt.Println(arg)

    // interface{}如何区分此时引用的底层数据类型到底是什么
    // 给interface{}提供"类型断言的"
    value, ok := arg.(string) // 使用.(判断的数据类型)即可判断参数的数据类型是不是此类型,其返回值是本身数据类型和判断的布尔值
    if !ok {
        fmt.Println("arg不是字符串类型")
    } else {
        fmt.Println("arg是字符串类型,value = ", value)
        fmt.Printf("value type is %T\n", value)
    }
    fmt.Println("================")
}

type Book struct { // 声明一个结构体
    author string
}

func main() {
    book := Book{"Golang"}

    myFunc(book)
    myFunc(100)
    myFunc("abc")
    myFunc(3.14)
}
  • 10-18行使用断言,来判断传入的数据类型是不是string类型

运行结果:
image.png
可以看到使用断言成功判断了传入的数据类型。

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏