在Go中实现io.Writer接口

I am trying to create a structure type which satisfies io.Writer interface via "Write" method:

package main

import (
    "fmt"
)

type Person struct {
    name []byte
}

func (p Person) Write(data []byte) (n int, err error) {
    p.name = data
    return len(data), nil
}

func main() {
    b := []byte("Dave")
    person := Person{}
    fmt.Fprint(person, b)
    fmt.Printf("Person name: %s
", person.name)
}

but instruction

fmt.Fprint(person, b)

doesn't work, person.Name remains empty slice. Why? Thank you in advance.

Two cents about value and pointer receivers. Function Write satisfying io.Writer can be defined both ways:

func (p Person) Write(data []byte) (n int, err error) {
...
}

This way function operates on a copy of the Person, that's why you don't see changes after function finishes.

And:

func (p *Person) Write(data []byte) (n int, err error) {
...
}

This way function works with a pointer to the original Person. That's why after the function end changes are visible.

If you want the Write function to modify the receiver object, you must make the receiver a pointer:

func (p *Person) Write(data []byte) (n int, err error) {
    p.name = data
    return len(data), nil
}

The fmt.Fprint function uses the default format for its operands. That's not what you want, you want to write the content of b as "%s", so you need to use fmt.Fprintf instead:

func main() {
    b := []byte("Dave")
    person := Person{}
    fmt.Fprintf(&person, "%s", b)
    fmt.Printf("Person name: %s
", person.name)
}

See on the playground.