如何停止 io.CopyN

Lod*_*dle 3 go

我有一些代码可以从文件复制到 tcp 套接字(如 ftp 服务器),并且希望能够在需要时中止此副本。

我只是使用 io.CopyN(socket, file, size) 并且看不到发出中止信号的方法。有任何想法吗?

Nic*_*ood 5

关闭输入文件怎么样? io.CopyN然后将返回错误并中止。

这里是一个演示(如果不是在Linux上运行的变化/dev/zero/dev/null您的操作系统相当于!)

package main

import (
    "fmt"
    "io"
    "log"
    "os"
    "time"
)

func main() {
    in, err := os.Open("/dev/zero")
    if err != nil {
        log.Fatal(err)
    }

    out, err := os.Create("/dev/null")
    if err != nil {
        log.Fatal(err)
    }

    go func() {
        time.Sleep(time.Second)
        in.Close()
    }()

    written, err := io.CopyN(out, in, 1E12)
    fmt.Printf("%d bytes written with error %s\n", written, err)
}
Run Code Online (Sandbox Code Playgroud)

运行时它会打印类似的东西

9756147712 bytes written with error read /dev/zero: bad file descriptor
Run Code Online (Sandbox Code Playgroud)