我正在尝试通过" 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仍为空切片。为什么?提前谢谢。
答案 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。