Как я могу получить os.Errno от os.Error? Другие способы использования os.Timeout? - PullRequest
1 голос
/ 29 октября 2011

Интерфейс net.Conn предоставляет методы SetTimeout, и я должен проверить возвращаемую ошибку с помощью os.Timeout .Однако я не вижу способа вызова os.Timeout для возвращенной ошибки os.Error.

(У меня есть ошибка os.Error read unix @: Resource temporarily unavailable, которая, кажется, состоит из двух частей: описание функции, которая была синхронизированаи strerror описание EAGAIN. Я пробовал err == os.EAGAIN, и он не работает, возможно, из-за дополнительной информации в os.Error).

Ответы [ 2 ]

1 голос
/ 29 октября 2011

В разделе «Пакет ввода-вывода» учебного пособия Go есть следующий фрагмент:

func OpenFile(name string, mode int, perm uint32) (file *File, err os.Error) {
  r, e := syscall.Open(name, mode, perm)
  if e != 0 {
    err = os.Errno(e)
  }
  return newFile(r, name), err
}

syscall.Open() имеет эту подпись:

func Open(path string, mode int, perm uint32) (fd int, errno int)

Так что я думаю, что можно с уверенностью предположить, что os.Error - это всего лишь тот целочисленный код ошибки, просто с добавленным пухом и вашим подходом к проверке, чтобы он был верным.

Чтобы выяснить, почему err == os.EAGAIN не работает для васЯ бы напечатал ошибку как значение типа int, а затем нашел файл вашей платформы errno.h для напечатанного значения.

0 голосов
/ 30 октября 2011

Вам нужно сделать утверждение типа . Допустим, kon имеет тип net.Conn, и вы читаете в буфер buf . Тогда:

if numread, err := kon.Read(buf); err != nil {
    if val, ok := err.(os.Errno); ok {
        if val.Timeout() {
            println("Connection to:", kon.RemoteAddr().String(), "timed out.")
        }
    }
}

Это, конечно, только суть идеи. На практике вы, вероятно, захотите сделать что-то более элегантное (то есть более сложный язык RL) и одновременно рассмотреть больше случаев с помощью Переключатели типа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...