Go泛型:将底层类型的切片返回为[]T

fzwojiic  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(90)

我正在开发一个遗传算法库,我对每个基因的碱基使用泛型类型声明,即。type Gene[T comparable] struct { Bases: []T }。这样做的原因是,不是每个问题都可以使用特定的数据类型来解决,例如float64uint8,因此它被设计为灵活的最终用户用例。我遇到了一个测序方案的问题,其中基因被separator []T分开:在空的最终基因的情况下,测序导致不应该存在的异常分隔符,这可能导致去测序以将其解析为单独的等位基因或仅包含分隔符的基因。有两种方法来处理它:第一种方法是忽略空的遗传结构,并在测序过程中排除它们,但这可能会删除有用的结构信息,例如:在模拟/优化期间保存包括遗传漂变的中间基因组的情况下;第二种方式是引入占位符序列来标识空结构。后者是我希望做的。
我希望通过翻转separator []T中每个碱基的位,从分隔符自动生成这个占位符序列,并且我可以使用“reflect”包来检测使用的是哪种类型。但是,当函数返回签名是[]T时,我不能返回[]int。我可以做下面的事情,但我不确定这是否是一个好的做法。

func inverseSeparator[T comparable](separator []T) []T {
    result := []T
    switch reflect.TypeOf(separator[0]).Kind() {
    case reflect.Int:
        var v interface{}
        for i := 0; i < len(separator); i++ {
            // do the bit flip
            v = resultOfBitFlip 
            result = append(result, v.(T))
        }
    // other cases
    }
    return result
}

字符串
将位翻转的结果转换回T切片的最佳方法是什么,或者这是一种糟糕的方法?

nmpmafwu

nmpmafwu1#

  • 我认为下面的代码是一个很好的优化,它提供了一个基本的错误处理机制:
func inverseSeparator[T comparable](separator []T) ([]T, error) {
    switch separator[0].(type) {
    case int:
        var result []T
        for _, val := range separator {
            // Perform bit flip
            // Make sure T is a valid numeric type (int, uint, etc.) before flipping bits
            if n, ok := val.(int); ok {
                // Perform bit flipping for integers
                flipped := ^n
                result = append(result, T(flipped).(T))
            } else {
                // Return an error if the type is not supported for bit flipping
                return nil, fmt.Errorf("unsupported type for bit flipping: %T", val)
            }
        }
        return result, nil
    // Handle other cases for different types, if needed.
    default:
        return nil, fmt.Errorf("unsupported type for inverseSeparator: %T", separator[0])
    }
}

字符串

相关问题