golang 打印类型和switch case选择

因为需要打印传输信息,要用到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()         // 调用 DogSpeak 方法

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

针对于这种只有两个类型的变量,还可以直接利用 if dog, ok := animal.(Dog); ok{}else{}.
当然如果不想用switch的话就只能ifelse了

posted @   wxlu  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示