dtyz76562 2014-04-23 21:34
浏览 29
已采纳

转到:深度复制切片

I would like to read a slice of strings representing hexadecimal numbers, and decode them to a slice of byte slices ([]string --> [][]byte). This is my code so far:

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
", 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
", args[i], err.Error())
            return nil, err
        }
    }
    fmt.Printf("line 69\tdata[0] = %x\tdata[1] = %x\tdata[2] = %x
",data[0], data[1], data[2])
    return data, nil
}

calling this code and passing args = []string{"010203","040506","070809"} yields the following output:

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

Presumably the function returns [][]byte{[]byte{}, []byte{}, []byte{0x07, 0x08, 0x09}}.

I understand that this is because of the pointer behavior of Go; what is the best practice for doing a deep copy of this kind?

  • 写回答

2条回答 默认 最新

  • dongxi7704 2014-04-24 00:33
    关注

    For example,

    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
    ",
                    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)
        }
    }
    

    Output:

    [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条)

报告相同问题?

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助