去:深拷贝切片

时间:2014-04-23 21:34:18

标签: go

我想读取表示十六进制数字的字符串片段,并将它们解码为一片字节片段([]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的指针行为;做这种深层复制的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

例如,

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'

答案 1 :(得分:0)

专门为处理深层复制而构建的包:http://godoc.org/code.google.com/p/rog-go/exp/deepcopy

您可以在此处查看来源:https://code.google.com/p/rog-go/source/browse/exp/deepcopy/deepcopy.go。它涵盖了复制切片和指针,所以它应该涵盖你的情况。