Golang: How to printf % x for bytes in a struct?

byte, go, printf

Solution

You could use reflection to inspect the struct and print any `[]byte`s that it has.

package main

import (
    "fmt"
    "reflect"
)

type SomeStruct struct {
    field1 []byte
    field2 []byte
}

type OtherStruct struct {
    intValue  int
    intSlice  []int
    byteSlice []byte
}

var typeOfBytes = reflect.TypeOf([]byte(nil))

func printSlicesHex(obj interface{}) {
    value := reflect.ValueOf(obj)
    typeOfObj := value.Type()
    for i := 0; i < value.NumField(); i++ {
        field := value.Field(i)
        if field.Type() == typeOfBytes {
            bytes := field.Bytes()
            printBytes(typeOfObj.Field(i).Name, bytes)
        }
    }
}

func printBytes(name string, bytes []byte) {
    fmt.Printf("%s: [% x]\n", name, bytes)
}

func main() {
    someStructInstance := SomeStruct{[]byte{249, 190, 180, 217}, []byte{29, 1, 0, 0}}
    fmt.Println("Printing []bytes in SomeStruct")
    printSlicesHex(someStructInstance)
    fmt.Println()

    otherStruct := OtherStruct{0, []int{0, 1, 2}, []byte{0, 1, 2, 3}}
    fmt.Println("Printing []bytes in OtherStruct")
    printSlicesHex(otherStruct)
}

For each `[]byte`, this example prints the name of the field and its data (in hex). You could improve on this by taking a custom function to do the printing, so you don't always have to print in hex.

Playground Link

Problem

``` var b [88]byte n, err := file.Read(b[:]) fmt.Printf("bytes read: %d Bytes: [% x]\n", n, b) ``` The above prints bytes in hexdecimal I have a struct like this ``` type SomeStruct struct { field1 []byte field2 []byte } someStructInstance := SomeStruct{[249 190 180 217], [29 1 0 0]} fmt.Println(someStructInstance) => {[249 190 180 217] [29 1 0 0]} ``` But ideally I would like it to print hexdecimal ``` => {[f9 be b4 d9] [1d 01 00 00]} ``` How would I go about that?

Original source