在Go语言中实现io.Writer接口

4
我正在尝试通过"Write"方法创建一个满足io.Writer接口的结构体类型:
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\n", person.name)
}

但是指令

fmt.Fprint(person, b)

代码不起作用,person.Name仍然是空的切片。原因是什么?谢谢。

2个回答

11

关于值和指针接收器的两个观点。满足io.WriterWrite函数可以通过两种方式定义:

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

这个函数是在 Person 的副本上操作的,所以函数完成后您看不到任何更改。

而且:

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

这种函数使用指向原始 Person 的指针。因此,在函数结束后更改是可见的。


7
如果您希望Write函数修改接收器对象,您必须将接收器变为指针:
func (p *Person) Write(data []byte) (n int, err error) {
    p.name = data
    return len(data), nil
}
fmt.Fprint函数会使用其操作数的默认格式。但这并不是你想要的,你需要将b的内容写成"%s"格式,因此你需要使用fmt.Fprintf函数代替:
func main() {
    b := []byte("Dave")
    person := Person{}
    fmt.Fprintf(&person, "%s", b)
    fmt.Printf("Person name: %s\n", person.name)
}

请点击这里查看示例代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接