在Go中实现io.Writer接口

时间:2017-11-04 07:26:47

标签: go interface

我正在尝试通过" 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 个答案:

答案 0 :(得分:4)

关于价值和指针接收器的两分钱。满足Write的函数io.Writer可以双向定义:

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

这种方式功能在Person的副本上运行,这就是为什么你在功能完成后看不到变化的原因。

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

这种方式函数使用指向原始Person的指针。这就是为什么功能结束变化后可见的原因。

答案 1 :(得分:3)

如果您希望GROUP BY函数修改接收器对象, 你必须使接收器成为一个指针:

Write

func (p *Person) Write(data []byte) (n int, err error) { p.name = data return len(data), nil } 函数使用其操作数的默认格式。 这不是您想要的,您想将fmt.Fprint的内容写为b, 所以你需要使用"%s"代替:

fmt.Fprintf

请参阅playground