如何使用子切片和Sscanf一起扫描十六进制字符串?

I have a parsing function that will fill a byte array with data given in a string format.

func Parse(data string) ([]byte, error) {
    bs := make([]byte, 6)

    // Create sub slices over larger slice
    a := bs[0:2]
    b := bs[2:4]
    c := bs[4:6]

    // Attempt to scan each string value into their respective slices
    _, err := fmt.Sscanf(data, "%4x-%4x-%4x", &a, &b, &c)

    return bs, err
}

Evaluating this function on the Go Playground the null value of the byte array is returned.

func main() {
    d, err := Parse("00ff-ff00-00ff")
    fmt.Printf("Value: %+v Error: %s
", d, err)
}

Which yields:

Value: [0 0 0 0 0 0] Error: %!s(<nil>)

I expected the above approach to return [0 255 255 0 0 255]. Is there a correct approach to populating a byte array with data using Sscanf?

When you run Sscanf it will re-allocate the pointers for a, b, and c so that they no longer point to their respective locations within bs. You'll see this if you output the values of these variables:

fmt.Printf("%v %v %v", a, b, c)
# Outputs [0 255] [255 0] [0 255]

You can return the result like this:

result := append(a, b...)
result = append(result, c...)
return result, nil

You can get the result that you expected, and by nearly identical means as you originally attempted. This modified version of your example yields Value: [0 255 255 0 0 255] Error: <nil>:

package main

import (
    "bytes"
    "fmt"
)

func parse(data string) ([]byte, error) {
    bs := make([]byte, 6)

    // Create sub slices over larger slice
    a := bs[0:2]
    b := bs[2:4]
    c := bs[4:6]

    // Attempt to scan each string value into their respective slices
    _, err := fmt.Sscanf(data, "%4x-%4x-%4x", &a, &b, &c)

    fmt.Println(a, b, c)
    return bytes.Join([][]byte{a, b, c}, []byte("")), err
}

func main() {
    d, err := parse("00ff-ff00-00ff")
    fmt.Printf("Value: %+v Error: %v
", d, err)
}