Golang Ошибка <nil>вместо EOF при нажатии Ctrl-D на Mac - PullRequest
0 голосов
/ 26 мая 2020

Мой код следующий. Это простая эхо-программа

package main

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

func main() {
    mustCopy(os.Stdout, os.Stdin)
}

func mustCopy(dst io.Writer, src io.Reader) {
    _, err := io.Copy(dst, src)

    fmt.Println(err)
    if err != nil {
        log.Fatal(err)
    }
}

Я также проверил сопоставления клавиатуры для EOF на ma c, используя stty all, он дает ^D как eof

Вывод программы выглядит как следует

a
b
b
c
c
<nil>

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Согласно документам golang .org / pkg / io / # Copy и указанное @BrunoReis Copy ведет себя так, как ожидалось, поскольку err будет nil, если Copy прекращено по причине EOF

0 голосов
/ 26 мая 2020

Далее мы заменяем io.Copy на io.CopyN, чтобы увеличить ожидание и закрыть досрочно.

package main

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

func main() {
  mustCopy(os.Stdout, os.Stdin)
}

func mustCopy(dst io.Writer, src io.Reader) {
  _, err := io.CopyN(dst, src, 2000) // 2000 is arbitrary, just big enough

  fmt.Println(err)
  if err != nil {
    log.Fatal(err)
  }
}

Пример выполнения:

a
a
b
b
c
c
EOF
2020/05/26 02:26:04 EOF
exit status 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...