因为需要打印传输信息,要用到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
判断也可以?当然我本人还没有试过,如果有读者试过希望可以回复一下结果