go语法--基础23--查看接口变量

查看接口变量

在这里插入图片描述

一、interface{}

  1. 表示任何类型
package main

import "fmt"

//返回任何类型
func getSum(s int) interface{} {
	return s;
}

//接收任何类型
func getSum2(s interface{}) interface{} {
	return s;
}

func main() {
	fmt.Println("----------返回任何类型----------")
	fmt.Println(getSum(123))
	fmt.Println("----------接收任何类型----------")
	fmt.Println(getSum2("S"))

}

输出:
----------返回任何类型----------
123
----------接收任何类型----------
S

二、Type Assertion (类型断言)

golang里的所有类型都实现了空接口interface{},所以通常将它作为一个函数的参数或者结构体的字段,以实现对类型的抽象。

2.1、用于转换函数里interface{}类型的参数

package main

import "fmt"

func main() {
	getType(1)
	getType(int16(1))
	getType(float32(1.1))
	getType(float64(1.1))
	getType("1")
	getType(true)
}

func getType(a interface{}) {
	switch t := a.(type) {
	case int:
		//a.(int) 强转的意思
		fmt.Println("int 类型,值是-->", a.(int))
	case int16:
		fmt.Println("int16 类型,值是-->", a.(int16))
	case float32:
		fmt.Println("float32 类型,值是-->", a.(float32))
	case float64:
		fmt.Println("float64 类型,值是-->", a.(float64))
	case string:
		fmt.Println("字符串 数字类型,值是-->", a.(string))
	default:
		fmt.Println("其他 类型,值是-->", t)
	}
}


输出

int 类型,值是--> 1
int16 类型,值是--> 1
float32 类型,值是--> 1.1
float64 类型,值是--> 1.1
字符串 数字类型,值是--> 1
其他 类型,值是--> true

2.2、a.(type)只能和switch搭配使用。

在使用前得用断言指明变量的类型,如果断言错误就会触发panic。如果不想触发panic,先做判断再使用。


package main

import "fmt"

func main() {
	a := int16(2)
	getType(a)
}

func getType(a interface{}) {
	_, ok := a.(int32)
	if !ok {
		fmt.Println("a 不是int32类型")
	}
}


输出

a 不是int32类型

2.3、用于转换结构体的interface{}类型字段

例如,我们写handler去接收消息,不可能每个发来的消息都写个函数去handle。利用空接口和类型断言的特性,就可以将业务抽象出来

package main

import "fmt"
import "time"

type Message struct {
	Id     int16
	Object interface{}
}

type Cat struct {
	name string
	age  int16
}

type Dog struct {
	name string
	age  int32
}

func main() {
	msg1 := Message{1, Cat{"小猫", 1}}
	msg2 := Message{2, Dog{"小狗", 8}}

	message_handler(msg1)
	time.Sleep(2000 * time.Millisecond)
	message_handler(msg2)
	time.Sleep(2000 * time.Millisecond)

}

func message_handler(msg Message) {
	switch msg.Id {
	case 1:
		//强转
		cat := msg.Object.(Cat)
		fmt.Println("小猫类型:", cat)
	case 2:
		dog := msg.Object.(Dog)
		fmt.Println("小狗类型:", dog)
	default:
		fmt.Println("其他类型", msg.Object)
	}
}


输出
小猫类型: {小猫 1}
小狗类型: {小狗 8}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值