首页 > 其他分享 >golang 打印类型和switch case选择

golang 打印类型和switch case选择

时间:2024-07-03 22:30:25浏览次数:1  
标签:case dog Dog Cat golang switch animal type Speak

因为需要打印传输信息,要用到pion的stats,而stats返回报告的又包含多个type,对于不同type有不同的数据统计,所以需要打印类型和switch case针对于不同的type执行不同的命令。

针对于返回变量类型,golang采用reflect包,对于变量valua,可以利用reflect.TypeOf(valua)返回变量类型,而这只能做一些简单的操作。并不能很有效的解决我们上述问题。

出现上述问题的原因是golang在interface接口支持不同的type,比如dog 和cat两个type都可能共有一个speak接口,但是我们调用的时候可能会不知道实际上是哪个类型,容易出现断言恐慌,这里借用qwen的示例代码

type Animal interface {
    Speak()
}

type Dog struct{}
func (d Dog) Speak() {
    fmt.Println("Woof!")
}

type Cat struct{}
func (c Cat) Speak() {
    fmt.Println("Meow!")
}

var animal Animal = Dog{} // 或者 Cat{}

dog := animal.(Dog) // 类型断言
dog.Speak()         // 调用 Dog 的 Speak 方法

可以看到,如果我们animal实际上是Cat{},然后下面又用了animal.(Dog),就会panic,所以更安全的方法是针对于不同type的同一个接口,我们对每个type都编写他们自己的执行指令,比如改成下面的代码

switch t:=animal.(type){
case Dog:

dog := animal.(Dog) // 类型断言
dog.Speak()         // 调用 Dog 的 Speak 方法

case Cat:
cat := animal.(Cat) // 类型断言
cat.Speak()         // 调用 Cat 的 Speak 方法
}

针对于这种只有两个类型的变量,还可以直接利用 if dog, ok := animal.(Dog); ok{}else{}.
当然如果不想用switch的话我估计 if reflect.TypeOf(animal)==Dog判断也可以?当然我本人还没有试过,如果有读者试过希望可以回复一下结果

标签:case,dog,Dog,Cat,golang,switch,animal,type,Speak
From: https://www.cnblogs.com/wxL-videostreaming/p/18282646

相关文章

  • VMware vSphere Tanzu部署_04_vCenter管理esxi并迁移网卡到DSwitch
    本次操作采用powershell来进行操作1.安装powershell和VM插件1.1.安装powershell在如下位置下载powershell进行:https://github.com/PowerShell/PowerShell/releases1.2.安装vm组件在cmd内输入pwsh后,输入:Install-Module-NameVMware.PowerCLI-ScopeCurrentUser......
  • Golang面试:泛型
    Go语言在1.18版本中引入了泛型(Generics),这是Go语言发展中的一个重要里程碑。泛型允许你编写更通用和可复用的代码,而无需牺牲类型安全性。以下是对Go中泛型的详细介绍,包括其语法、使用场景和示例代码。1.泛型的基本概念泛型允许你定义可以处理多种数据类型的函数和数据结构,而无需......
  • Golang开发:构建支持并发的网络爬虫
    Golang开发:构建支持并发的网络爬虫随着互联网的快速发展,获取网络数据成为了许多应用场景中的关键需求。网络爬虫作为一种自动化获取网络数据的工具,也因此迅速崛起。而为了应对日益庞大的网络数据,开发支持并发的爬虫成为了必要的选择。本文将介绍如何使用Golang编写一个支持......
  • Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire
    一、前言线上项目往往依赖非常多的具备特定能力的资源,如:DB、MQ、各种中间件,以及随着项目业务的复杂化,单一项目内,业务模块也逐渐增多,如何高效、整洁管理各种资源十分重要。本文从“术”层面,讲述“依赖注入”的实现,带你体会其对于整洁架构&DDD等设计思想的落地,起到的支撑作用。......
  • 【力扣 - 每日一题】3115. 质数的最大距离(一次遍历、头尾遍历、空间换时间、埃式筛、
    原题链接题目描述给你一个整数数组nums。返回两个(不一定不同的)质数在nums中下标的最大距离。示例1:输入:nums=[4,2,9,5,3]输出:3解释:nums[1]、nums[3]和nums[4]是质数。因此答案是|4-1|=3。示例2:输入:nums=[4,8,2,8]输出:0解释:nums[2]是质......
  • golang 构建标签(go:build)条件编译
     //go:build是Go语言(golang)中的一种构建标签(buildtag),用于控制源代码文件在特定条件下是否被编译。这个注释标记允许你在同一个包内编写针对不同平台、操作系统或编译条件的代码。当gobuild或gotest等命令执行时,它们会检查这些标签来决定哪些文件应该包含在构建过程中......
  • 区分公有地址和私有地址, golang实现
     区分公有地址(PublicIPAddresses)和私有地址(PrivateIPAddresses)主要依据它们的分配、使用范围以及是否能在全球互联网上直接路由。 以下是一些关键区别:  分配和管理: 公有地址:由互联网地址分配机构(InternetAssignedNumbersAuthority,IANA)管理......
  • golang 实现tcp socket 通信
    都说golang适合网络编程,知道今天写了tcp我才知道他到底有多简洁。(虽然已经对着golang的webrtc研究很久了)首先是client端代码:packagemainimport( "bufio" "fmt" "net")funcmain(){ conn,err:=net.Dial("tcp","192.168.1.106:8080") iferr!=ni......
  • RabbitMQ延时任务通过死信队列实现(golang)
    最近在一个项目中,需要实现在用户上传图片30分钟后,删除对应图片,以保证用户隐私。我们使用rabbitmq来实现。基于rabbitmq实现延时任务有两种方式,一种为队列ttl+死信exchange,另一种为安装插件(https://github.com/rabbitmq/rabbitmq-delayed-message-exchange)。其中安装......
  • Golang:go-querystring将struct编码为URL查询参数的库
    Golang:go-querystring将struct编码为URL查询参数的库原创 吃个大西瓜 CodingBigTree 2024-05-0908:30 北京go-querystringisaGolibraryforencodingstructsintoURLqueryparameters.译文:go-querystring将struct编码为URL查询参数的Golang库文档ht......