Go:深度复制切片
我想读取表示十六进制数的字符串片段,并将它们解码为字节片段(Go:深度复制切片,go,Go,我想读取表示十六进制数的字符串片段,并将它们解码为字节片段([]字符串-->[]字节)。这是我目前的代码: 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) tm
[]字符串-->[]字节
)。这是我目前的代码:
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
}
该函数可能返回[]byte{[]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'
谢谢你的回复。我比较了你的代码和我的代码,发现了错误。实际上,我将make()指令放在循环中,每次迭代都分配一个新数组+1为工作示例,并被接受。从习惯上看,这是执行此任务的一种可接受的方式;错误实际上在第4行。make()指令需要移到for循环之外。我做到了,现在一切都很好。
[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'