登录
首页 >  Golang >  Go问答

能否将不定长度的切片在golang中转换为数组?

来源:stackoverflow

时间:2024-02-07 20:03:23 390浏览 收藏

你在学习Golang相关的知识吗?本文《能否将不定长度的切片在golang中转换为数组?》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

本质上,我需要禁止接收到的不同类型的数据出现重复值(即 int8(1),然后 uint32(1) 或 big.int(1) 无效),大致如下:

var m map[interface{}]bool

func tryAddValue(value interface{}) {
    switch v := value.(type) {
    // ... other types omitted for brevity
    case *big.Int:
        if v.IsUint64() {
            value = v.Uint64()
        } else if v.IsInt64() {
            value = v.Int64()
        } else {
            bits := v.Bits()
            value = [len(bits)]big.Word(bits)
            //       ^^^ This doesn't compile because it's not a constant
        }
    }
    if m[value] {
        panic(fmt.Errorf("value %v already exists", value))
    }
    m[value] = true
}

由于切片不能是映射键,因此我对 big.int 的唯一其他选择是字符串转换和数组转换,而字符串转换的成本很高(此代码将位于热路径上)。


正确答案


啊,反思一下救援:

    bits := v.bits()
    t := reflect.arrayof(len(bits), reflect.typeof(bits[0]))
    arr := reflect.new(t).elem()
    slice := arr.slice(0, len(bits)).interface()
    copy(slice.([]big.word), bits)
    value = arr.interface()

仅使用整数类型的基本实现https://go.dev/play/p/vos4exxrket一个>

注意:除非您确实需要一个实际的数组,否则有更快的方法来创建映射键。请参阅评论。

注2:上面的代码没有考虑符号。要包含符号信息,请将其手动编码为第一个单词:

    bits := v.Bits()
    arrLen := len(bits) + 1
    t := reflect.ArrayOf(arrLen, reflect.TypeOf(bits[0]))
    arr := reflect.New(t).Elem()
    slice := arr.Slice(0, arrLen).Interface().([]big.Word)
    slice[0] = big.Word(v.Sign())
    copy(slice[1:], bits)
    value = arr.Interface()

https://go.dev/play/p/lkjqjjsenw7

好了,本文到此结束,带大家了解了《能否将不定长度的切片在golang中转换为数组?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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