• 程序首页
  • 文章
  • 下载
  • 合集
  • 在线运行代码
手机客户端
首页 >  文章列表 > 能否在golang中将切片转换为具有任意长度的数组?

能否在golang中将切片转换为具有任意长度的数组?

185 2024-02-11
问题内容

本质上,我需要禁止接收到的不同类型的数据出现重复值(即 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

来源: https://stackoverflow.com/questions/76619816/is-it-possible-to-convert-arbitrary-length-slices-to-arrays-in-golang
上一篇 检索reflect.Kind的基本类型 下一篇 如何在切片初始化时设置初始值和容量?

本类最新

查看更多
  • 如何选择合适的golang框架与流行框架

    如何选择合适的golang框架与流行框架

  • golang函数通过管道传递参数的详解

    golang函数通过管道传递参数的详解

  • Golang 中函数测试的入门指南

    Golang 中函数测试的入门指南

  • Go 框架如何优化存储性能?

    Go 框架如何优化存储性能?

  • Golang 框架中的安全头部设置与响应过滤

    Golang 框架中的安全头部设置与响应过滤

  • golang框架的自动化测试方法:针对不同用例的自动化解决方案

    golang框架的自动化测试方法:针对不同用例的自动化解决方案

热门推荐

查看更多
  • golang的框架如何编写面向可测试的代码?
    golang的框架如何编写面向可测试的代码?
    501 2024-09-29
  • golang框架是否适合微服务架构?
    golang框架是否适合微服务架构?
    499 2024-09-25
  • 主流golang框架的替代选项
    主流golang框架的替代选项
    499 2024-09-28
  • 如何使用 Golang 框架进行性能监控?
    如何使用 Golang 框架进行性能监控?
    498 2024-10-21
  • 在 Go 框架中实现分布式部署的常见错误
    在 Go 框架中实现分布式部署的常见错误
    496 2024-10-15
  • 如何在 Golang 函数中使用闭包参数?
    如何在 Golang 函数中使用闭包参数?
    495 2024-09-25

热门教程

查看更多
  • 双引号是否过多,这就是问题所在!

    双引号是否过多,这就是问题所在!

  • 中国联通如何查话费余额

    中国联通如何查话费余额

  • 海贝音乐在哪里设置定时播放 开启定时停止播放流程详解

    海贝音乐在哪里设置定时播放 开启定时停止播放流程详解

  • 雪球app如何取消定投 雪球关闭分配方案方法

    雪球app如何取消定投 雪球关闭分配方案方法

  • WordPress网格插件Infinite Grid Pro v3.1.0

    WordPress网格插件Infinite Grid Pro v3.1.0

  • Java函数的返回值是否可以定义为final?

    Java函数的返回值是否可以定义为final?

玻璃钢生产厂家临沧市玻璃钢雕塑设计供应西藏玻璃钢雕塑制作玻璃钢雕塑 兔商场美陈北极熊主题抚州动物玻璃钢雕塑市场福建开业商场美陈订购上海正宗玻璃钢雕塑制造厂家江苏红色玻璃钢花盆开远市玻璃钢雕塑生产厂家三明玻璃钢仿铜雕塑成品玻璃钢花盆研究石家庄生肖玻璃钢雕塑庆阳玻璃钢动物雕塑多少钱呈贡玻璃钢雕塑设计公司贵不贵广州玻璃钢雕塑特点池州定制玻璃钢雕塑批发玻璃钢雕塑保存期夏天商场美陈布置青岛市玻璃钢人物雕塑供应商五华区玻璃钢雕塑加工厂家咨询咸阳火烈鸟玻璃钢雕塑厂家真人大小玻璃钢雕塑成本防老化玻璃钢花盆欧式玻璃钢卡通雕塑要求安徽环保玻璃钢雕塑图片仿真玻璃钢雕塑公司哪家好茶艺人玻璃钢人物雕塑摆件售卖罗马柱玻璃钢雕塑漳州玻璃钢西瓜雕塑昆明玻璃钢雕塑加工厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化