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行分别将结构体、整型、字符串型、浮点型作为参数传入函数中
运行结果:
可以看到万能类型可以接收任意数据类型参数,这样通过万能类型就可以接收多种数据类型,类似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类型
运行结果:
可以看到使用断言成功判断了传入的数据类型。
此处评论已关闭