duanna5749
2017-11-04 07:26
浏览 257
已采纳

在Go中实现io.Writer接口

I am trying to create a structure type which satisfies io.Writer interface via "Write" method:

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
", person.name)
}

but instruction

fmt.Fprint(person, b)

doesn't work, person.Name remains empty slice. Why? Thank you in advance.

图片转代码服务由CSDN问答提供 功能建议

我试图通过“ Write”方法创建一种满足io.Writer接口的结构类型:

 包main 
 
import(
“ fmt” 
)
 
type Person结构{
 name [] byte 
} 
 
func(p Person)写入 (data [] byte)(n int,err错误){
 p.name = data 
返回len(data),nil 
} 
 
func main(){
b:= [] byte(“  Dave“)
 person:= Person {} 
 fmt.Fprint(person,b)
 fmt.Printf(” Person name:%s 
“,person.name)
} 
    
 
 

但是说明

  fmt.Fprint(person,b)
   
 
 <  p>无效,人员。名称保留为空片。 为什么? 预先谢谢您。 
 
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • duanjiongzhen2523 2017-11-04 08:25
    已采纳

    Two cents about value and pointer receivers. Function Write satisfying io.Writer can be defined both ways:

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

    This way function operates on a copy of the Person, that's why you don't see changes after function finishes.

    And:

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

    This way function works with a pointer to the original Person. That's why after the function end changes are visible.

    打赏 评论
  • dpl22899 2017-11-04 07:46

    If you want the Write function to modify the receiver object, you must make the receiver a pointer:

    func (p *Person) Write(data []byte) (n int, err error) {
        p.name = data
        return len(data), nil
    }
    

    The fmt.Fprint function uses the default format for its operands. That's not what you want, you want to write the content of b as "%s", so you need to use fmt.Fprintf instead:

    func main() {
        b := []byte("Dave")
        person := Person{}
        fmt.Fprintf(&person, "%s", b)
        fmt.Printf("Person name: %s
    ", person.name)
    }
    

    See on the playground.

    打赏 评论

相关推荐 更多相似问题