空接口

就是没有起名的接口,通常定义成下面的格式

interface{} //空接口

所有的类型都实现了空接口也就是任意类型的变量都能保存到空接口中

例子

package main

import "fmt"

func main() {
  var m1 map[string]interface{}
  m1 = make(map[string]interface{}, 16)
  m1["helloworld"] = true
  m1["test"] = 123456
  m1["王"] = [...]string{"唱", "跳", "rap"}
  fmt.Println(m1)
}

其实和python中的字典类型一样,可以在value中存任意值,一般用于未知value值来进行声明空接口

空接口应用

空接口接参

作为函数的参数可以接受任意类型

func null_interface(a interface{}) { //这里interface就是接受任意类型的变量
  fmt.Printf("type:%T, value:%v", a, a)
}

类型断言

空接口可以存储任意类型的值,那我们如何获取其存储的具体数值呢?

虽然可以在输入中打印值类型但是如何在代码中判断?

通过ok做错误判断,在go语言中一个代码端执行完成后有两个值一个是你设置的代码返回值,一个是执行成功失败的返回值0 or 1

package main

import "fmt"

// 方法一通过获取参数执行的返回值来判断
func assign(a interface{}) {
  fmt.Printf("type: %T\n", a)
  str, ok := a.(string)
  if !ok {
    fmt.Println("猜错了!重新猜!")
  } else {
    fmt.Println("传进来的是一个字符串变量:", str)
  }
}

func main() {
  assign(100)
}

通过switch判断

package main

import "fmt"

// 方法一通过获取参数执行的返回值来判断
//func assign(a interface{}) {
//  fmt.Printf("type: %T\n", a)
//  str, ok := a.(string)
//  if !ok {
//    fmt.Println("猜错了!重新猜!")
//  } else {
//    fmt.Println("传进来的是一个字符串变量:", str)
//  }
//}

func assign1(a interface{}) {
  fmt.Printf("type: %T\n", a)
  switch a.(type) { //这里获取空接口值类型
  case string:
    fmt.Println("这是一个字符串:", a)
  case int:
    fmt.Println("这是一个数字:", a)
  case bool:
    fmt.Println("这是一个布尔值:", a)
  case int64:
    fmt.Println("这是一个int64:", a)
  }
}

func main() {
  assign1(100)
}

因为空接口可以存储任意类型值的特点,所以空接口在Go语言中适用十分广泛

关于接口需要注意的是,只有当两个或两个以上的具体类型必须以相同的方式进行处理才需要定义接口。不要为了接口而写接口,那样只会增加不必要的抽象,导致不必要的运行损耗。

posted @ 2023-02-08 21:05  suknna  阅读(49)  评论(0)    收藏  举报