登录
首页 >  Golang >  Go问答

将多个变量接口合并为动态类型的转换方法

来源:stackoverflow

时间:2024-02-12 23:15:24 486浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《将多个变量接口合并为动态类型的转换方法》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我知道对于单个变量 x,要检查它是否属于某种类型 b,只需执行

switch b.(type) {
case *B:
  fmt.Println("find it!")
default:
  fmt.Println("can't find it")
}

但现在我有一个由 4 个变量组成的切片,我想知道它们的类型是否遵循某种模式(例如 a,b,c,d 类型)。

我知道我可以用一个繁琐的 forloop 来完成,将许多 ifs 和 cases 包装在一起,但我想知道是否有一种更优雅的方式来实现我想要的。


正确答案


您可以对您定义的某些“真相”切片使用 reflect 。此函数将接受 2 个切片并比较它们的类型,如果类型不以相同顺序匹配,则返回错误。

所以 arr 是您的 []interface{} 切片。 exp 为期望的切片,如

// the values don't matter, only the type for the "truth" slice.
exp := []interface{}{int(0), "", foo{}, bar{}}

参见https://goplay.tools/snippet/5nja8M00DSt

// sametypes will compare 2 slices. if the slices have a different length,
// or any element is a different type in the same index, the function will return
// an error.
func sametypes(arr, exps []interface{}) error {
    if len(arr) != len(exps) {
        return errors.new("slices must be the same length")
    }

    for i := range arr {
        exp := reflect.typeof(exps[i])
        found := reflect.typeof(arr[i])
        if found != exp {
            return fmt.errorf("index '%d' expected type %s, got %s", i, exp, found)
        }
    }

    return nil
}

请记住,foo{}&foo{} 是不同的类型。如果您不关心它是否是指针,则必须执行额外的反射代码。如果类型是指针,您可以执行此操作来获取 ptr 的值

x := &Foo{}
t := reflect.TypeOf(x)
// If t is a pointer, we deference that pointer
if t.Kind() == reflect.Ptr {
    t = t.Elem()
}

// t is now of type Foo

本篇关于《将多个变量接口合并为动态类型的转换方法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>