gpt4 book ai didi

go - 为什么我的 Go Reader 不工作?

转载 作者:IT王子 更新时间:2023-10-29 00:38:11 24 4
gpt4 key购买 nike

我试图在 Go 中实现一个非常简单的 io.Reader:

package main

import (
"io"
"os"
"strings"
)

type rot13Reader struct {
r io.Reader
}

// Very trivial function I implemented.
func (r *rot13Reader) Read(p []byte) (int, error) {
return 5, nil // Return some trivial values for now.
}

func main() {
s := strings.NewReader(
"Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}

最后,我想让rot13Reader申请ROT13到它正在读取的字符串,但现在,我只是想创建一个非常简单的 io.Reader 来匹配正确的接口(interface)。

当我运行这个程序时,它从不停止。为什么?哪里有无限循环?


更新:我尝试通过下面的 for 循环改变 data 拼接,但它似乎并没有真正改变拼接。我是否需要以某种方式复制数据

package main

import (

"io"
"os"
"strings"
)

type rot13Reader struct {
r io.Reader
}

func (r *rot13Reader) Read(data []byte) (int, error) {
bytesRead, err := r.r.Read(data)

// Try to alter data... only without this for loop, text prints in standard output... odd.
for i := 0; i < bytesRead; i++ {
data[i] += 13
}

return bytesRead, err
}

func main() {
s := strings.NewReader(
"Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
}

最佳答案

io.Copy 持续调用您的 Read() 方法。

来自文档:

“从 src 复制副本到 dst,直到到达任一 EOF在 src 上或发生错误。它返回字节数复制以及复制时遇到的第一个错误(如果有)。”

您需要发送 EOF 或返回错误。

这是一个不会无限循环的更新版本。

http://play.golang.org/p/UCfcw4S8yf

package main

import (
"io"
"os"
"strings"
"fmt"
)

type rot13Reader struct {
r io.Reader
}

// Very trivial function I implemented.
func (r *rot13Reader) Read(p []byte) (int, error) {
return 5, io.EOF // Return some trivial values for now.
}

func main() {
s := strings.NewReader(
"Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
fmt.Printf("Done copying...\n")
}

如果你想实际复制字符串到输出。您需要从 rot13Reader.r 中读取并复制到 Read() 方法中的 p。

http://play.golang.org/p/dSCauz0uTw

package main

import (
"io"
"os"
"strings"
"fmt"
)

type rot13Reader struct {
r io.Reader
}

// Very trivial function I implemented.
func (r *rot13Reader) Read(p []byte) (int, error) {
i, err := r.r.Read(p)
return i, err
}

func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr!")
r := rot13Reader{s}
io.Copy(os.Stdout, &r)
fmt.Printf("\nDone copying...\n")
}

关于go - 为什么我的 Go Reader 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com