草庐IT

Go:深拷贝 slice

coder 2023-06-28 原文

我想读取一段表示十六进制数的字符串,并将它们解码为一段 byte slice 段 ([]string --> [][]byte)。到目前为止,这是我的代码:

func (self *algo_t) decode_args(args []string) ([][]byte, error) {
    var data [][]byte
    for i := uint32(0); i < self.num_args; i++ {
        data = make([][]byte, self.num_args)
        tmp, err := hex.DecodeString(args[i])
        fmt.Printf("i = %d\ttmp = %x\n", i, tmp)
        data[i] = make([]byte, len(tmp))
        copy(data[i], tmp)
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error decoding hex string %s: %s\n", args[i], err.Error())
            return nil, err
        }
    }
    fmt.Printf("line 69\tdata[0] = %x\tdata[1] = %x\tdata[2] = %x\n",data[0], data[1], data[2])
    return data, nil
}

调用此代码并传递 args = []string{"010203","040506","070809"} 会产生以下输出:

i = 0    tmp = 010203
i = 1    tmp = 040506
i = 3    tmp = 070809
line 69 data[0] =     data[1] =     data[2] = 070809

推测该函数返回 [][]byte{[]byte{}, []byte{}, []byte{0x07, 0x08, 0x09}}

我理解这是因为 Go 的指针行为;执行此类深拷贝的最佳做法是什么?

最佳答案

例如,

package main

import (
    "encoding/hex"
    "fmt"
)

// Decode hex []string to [][]byte
func decode(s []string) ([][]byte, error) {
    b := make([][]byte, len(s))
    for i, ss := range s {
        h, err := hex.DecodeString(ss)
        if err != nil {
            err = fmt.Errorf(
                "Error decoding hex string %s: %s\n",
                ss, err.Error(),
            )
            return nil, err
        }
        b[i] = h
    }
    return b, nil
}

func main() {
    s := []string{"010203", "040506", "070809"}
    fmt.Println(s)
    b, err := decode(s)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(b)
    }
    s = []string{"ABCDEF", "012345", "09AF"}
    fmt.Println(s)
    b, err = decode(s)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(b)
    }
    s = []string{"01", "123XYZ"}
    fmt.Println(s)
    b, err = decode(s)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(b)
    }
}

输出:

[010203 040506 070809]
[[1 2 3] [4 5 6] [7 8 9]]
[ABCDEF 012345 09AF]
[[171 205 239] [1 35 69] [9 175]]
[01 123XYZ]
Error decoding hex string 123XYZ: encoding/hex: invalid byte: U+0058 'X'

关于Go:深拷贝 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255629/

有关Go:深拷贝 slice的更多相关文章

  1. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  2. ruby-on-rails - 用于 Ruby 的 vim 中的全局 "Go to definition"? - 2

    自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby​​编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例

  3. ruby - 为什么 Array#slice 和 Array#slice!表现不同? - 2

    我不明白为什么在Ruby中,Array#slice和Array#slice!的行为与Array#sort和Array#sort!(一个返回新数组的结果,另一个处理当前对象)。使用sort第一个(没有爆炸),返回当前数组的排序副本,并且sort!对当前数组进行排序。slice,返回指定范围的数组,slice!从当前对象删除指定范围。Array#slice!的行为为何如此,而不是使当前对象成为具有指定范围的数组?例子:a=[0,1,2,3,4,5,6,7,8,9]b=a.slice(2,2)puts"slice:"puts"a="+a.inspectputs"b="+b.inspectb=

  4. ruby - Rubys 的 each_slice 的 Scala 版本? - 2

    Scala有Rubys的版本吗each_slice来自Array类? 最佳答案 Scala2.8有grouped将数据分成大小为n的block(可用于实现each_slice功能):scala>vala=Array(1,2,3,4,5,6)a:Array[Int]=Array(1,2,3,4,5,6)scala>a.grouped(2).foreach(i=>println(i.reduceLeft(_+_)))3711据我所知,在2.7.x中没有任何东西可以开箱即用,但是从take(n)和drop(n)来自RandomAccess

  5. ruby - 为什么 Ruby 中没有深拷贝方法? - 2

    我正在研究技术图纸(svg/ruby)的解决方案。我想操作矩形,并且在这个类中有一个add!方法:classRectdefadd!(delta)@x1+=delta...#andsoonselfendend我还需要一个add方法返回一个Rect,但不操作self:defadd(delta)r=self.dup/clone/"copy"#dup和clone不做我的事但是:defcopy;Marshal.load(Marshal.dump(self));end会。为什么普通Ruby中不存在这样的基本功能?请不要告诉我我可以颠倒add和add!,让add完成工作,然后add!调用它。

  6. ruby - Array#slice 的重叠等效项 - 2

    这个问题在这里已经有了答案:Rubyarrayaccess2consecutive(chained)elementsatatime(4个答案)关闭3年前。给定这个Ruby数组:[1,2,3,4,5]像这样迭代它的最简单方法是什么?[[1,2],[2,3],[3,4],[4,5]]还是这个?[[1,2,3],[2,3,4],[3,4,5]]

  7. ruby-on-rails - Ruby 中数组的深拷贝 - 2

    我想在生产环境中获取一个对象,并将其精确复制(复制其内容)到另一个相同类型的对象。我尝试从ruby​​控制台以3种方式执行此操作,但均无效:假设您将tt作为要复制的第一个对象,并将tt2作为副本对象。我尝试的第一种方法是克隆数组tt2.patients=tt.urls.patientstt2.doctors=tt.segments.doctorstt2.hospitals=tt.pixels.hospitals我尝试的第二种方法是复制数组,这实际上与克隆数组相同:tt2.patients=tt.patients.duptt2.doctors=tt.doctors.duptt2.hosp

  8. DiFi: A Go-as-You-Pay Wi-Fi Access System 精读笔记(三) - 2

    IV.SYSTEMIMPLEMENTATIONWeadoptmodulardesignfollowingtheintegrationofblockchain.Itbringsmoreflexibilitybyseparatingtheimplementationofdifferentfunctionalities,sowecouldleveragetheadvantagesoftheblockchain-basedsmartcontractwhilereducingoverhead.Figure3illustrateshowdifferentmodulesareinvolvedintheint

  9. go-templates - 如何根据表达式有条件地在 Go 模板中设置变量,如果不使用 if 语句包装可能会导致错误 - 2

    问题我该如何做这样的事情:{{$use_ssl:=(ne$.Env.CERT_NAME"")}}其中$.Env.CERT_NAME可能为零/未定义。如果它是零,它给出这个错误:at:errorcallingne:invalidtypeforcomparison注意:我无法控制传递给Go模板的对象,因此必须完全在模板本身内解决这个问题。我尝试过的我试图通过首先检查它是否为非空来变通:{{$use_ssl:=(($.Env.CERT_NAME)&&(ne$.Env.CERT_NAME""))}}但它给出了这个错误:unexpected"&"inoperand所以我切换到这个,这在语法上是允

  10. 【JavaScript】手撕前端面试题:对象参数浅拷贝 | 简易深拷贝 | 完整深拷贝 - 2

    🖥️NodeJS专栏:Node.js从入门到精通🖥️博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述)🖥️TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结)🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬👉你的一键三连是我更新的最大动力❤️!文章目录1、浅拷贝要求思路代码2、简易深拷贝要求思路代码3、完整深拷贝要求思路代码1、浅拷贝要求补全JavaScript代码,要求实现一个对象参数的浅拷贝并返回拷贝之后的新对象。注意:参数可能包含函数、正则、日期、ES6新对象是对对象的参数进行浅拷贝,并不是直接对整个对象进行浅拷贝(整个

随机推荐