请问 fmt.Fprint(&b, "Hello World") 的值 b 为什么需要加& ???

2021-04-20 16:12:55 +08:00
 zjttfs

看到一段代码 :

func main() {
	var b bytes.Buffer
	fmt.Fprint(&b, "Hello World")
	var w io.Writer
	w = &b
	fmt.Println(w)
}

跟随到 fmt.Fprint

type Writer interface {
	Write(p []byte) (n int, err error)
}

func Fprint(w io.Writer, a ...interface{}) (n int, err error) {
	p := newPrinter()
	p.doPrint(a)
	n, err = w.Write(p.buf)
	p.free()
	return
}

为什么这里需要传指针?

不是有 * 符号的时候才需要指针吗?有点懵.

672 次点击
所在节点    Go 编程语言
3 条回复
Microkernel
2021-04-20 16:16:02 +08:00
bytes.Buffer 是个 struct,io.Writer 是个 interface
Vegetable
2021-04-20 16:19:29 +08:00
不知道你具体指的是哪里,fmt.Fprint(&b, "Hello World")这里传地址,是因为实现 Write 方法的是*bytes.Buffer,`func (b *Buffer) Write(p []byte) (n int, err error)`,而不是 bytes.Buffer,所以&b 是 io.Writer,b 不是。
zjttfs
2021-04-20 16:23:29 +08:00
@Vegetable
懂了. 我应该去看.
`bytes.Buffer` 实现的 `Write` 方法.
这里的`Write`是需要传指针的.
我跟踪错地方了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX