My background. I've written a lot of C and Python (and other things), but 
am new to Go. 

I am getting results from fmt.Fprintf that I can't understand. Here's what 
I'm puzzled about:

I wrote, in Go, a file hex-and-ASCII dumper of the kind everyone has seen. 
(Like the Unix xxd command, for example.) I've been using it, and it DOES 
work. The output looks like this:

00000000 2f 2f 20 50 61 63 6b 61 67 65 20 68 64 75 6d 70   // Package hdump
00000010 20 64 75 6d 70 73 20 64 61 74 61 20 69 6e 20 74    dumps data in t
00000020 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 68   he traditional h

The dumping is done by a function that accepts a count and a []bytes, and 
an io.Writer to send the output to. I pass os.Stdout to the function, and 
the hex/ASCII you see above is printed. I won't show all that code, but 
perhaps you can trust me that I've used it for weeks with no problems.

Then I started reading about how good Go programmers write unit tests, and 
I wrote a simple test. Of course, I need to capture the output, instead of 
sending it to os.Stdout. I read about strings.Builder, and that seems to be 
what I need. As a first attempt, I'll send the same parameters to my 
function, one going to stdout and other to a strings.Builder. I'll print 
the contents of the string.Builder and it should match what gets sent to 
stdout.

Here is the code:

func TestHdump(t *testing.T) {
    var b strings.Builder

    dest := NewHdumper(&b)
    dest.DumpBytes(21, []byte("\t123456789abcdefHello"))
    fmt.Printf(b.String())

    fmt.Printf("for real:\n")
    dest = NewHdumper(os.Stdout)
    dest.DumpBytes(21, []byte("\t123456789abcdefHello"))
}

Quite simple: do it once to the strings.Builder and once to stdout, and 
visually compare them. (I'll make it a real test, after I sort this out.) 
But the output is VERY different, and I can't figure out why:
                                 00000000 09 31 32 33 34 35 36 37 38 39 61 
62 63 64 65 66   .123456789abcdef
00000010 48 65 6c 6c 6f   Hello
for real:
00000000 09 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66   .123456789abcdef
00000010 48 65 6c 6c 6f                                    Hello

There are two big differences:
1. The first line of 16 bytes is indented (a lot) when going to the 
strings.Builder.
2. The "Hello" chars are not "pushed out to the right" to align with the 
ASCII characters of the line above.

Now, why aren't these two things absolutely identical? HELP!



-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/6bb5e6c2-8da7-4597-b92b-82ea3c5577b0n%40googlegroups.com.

Reply via email to