V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
zjttfs
V2EX  ›  Go 编程语言

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

  •  
  •   zjttfs · 2021-04-20 16:12:55 +08:00 · 752 次点击
    这是一个创建于 1292 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到一段代码 :

    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
    }
    

    为什么这里需要传指针?

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

    Microkernel
        1
    Microkernel  
       2021-04-20 16:16:02 +08:00   ❤️ 1
    bytes.Buffer 是个 struct,io.Writer 是个 interface
    Vegetable
        2
    Vegetable  
       2021-04-20 16:19:29 +08:00   ❤️ 1
    不知道你具体指的是哪里,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
        3
    zjttfs  
    OP
       2021-04-20 16:23:29 +08:00
    @Vegetable
    懂了. 我应该去看.
    `bytes.Buffer` 实现的 `Write` 方法.
    这里的`Write`是需要传指针的.
    我跟踪错地方了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2462 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:36 · PVG 18:36 · LAX 03:36 · JFK 06:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.