2015-02-14 33 views
6

Sonunda diski dolduracak ve ENOSPC (yalnızca bir kavram kanıtı) ile başarısız olan aşağıdaki Go kodum var. os.Write tarafından döndürülen () nedeniyle döndürülen err'dan nasıl belirleyebilirim (bu nedenle yazım işleminden sonra errno kapmak için bir yola ihtiyacım var)?Bir yazma işleminden sonra hata oluştu

package main 

import (
    "log" 
    "os" 
) 

func main() { 
    fd, _ := os.Create("dump.txt") 

    defer fd.Close() 

    for { 
     buf := make([]byte, 1024) 

     _, err := fd.Write(buf) 
     if err != nil { 
      log.Fatalf("%T %v", err, err) 
     } 
    } 
} 

DÜZENLEME: @FUZxxl olarak programı Güncelleme önerdi:

package main 

import (
    "log" 
    "os" 
    "syscall" 
) 

func main() { 
    fd, _ := os.Create("dump.txt") 

    defer fd.Close() 

    for { 
     buf := make([]byte, 1024) 

     _, err := fd.Write(buf) 
     if err != nil { 

      log.Printf("%T %v\n", err, err) 
      errno, ok := err.(syscall.Errno) 

      if ok { 
       log.Println("type assert ok") 
       if errno == syscall.ENOSPC { 
        log.Println("got ENOSPC") 
       } 
      } else { 
       log.Println("type assert not ok") 
      } 
      break 
     } 
    } 
} 

Ancak, beklenen sonucu elde edemiyorum. İşte çıktı şöyledir:

2015/02/15 10:13:27 *os.PathError write dump.txt: no space left on device 
2015/02/15 10:13:27 type assert not ok 

cevap

4

Dosya işlemleri genellikle *os.PathError return; Bu gibi os.PathError için err döküm ve altında yatan nedeni incelemek için Err alanı kullanabilirsiniz:

patherr, ok := err.(*os.PathError) 
if ok && patherr.Err == syscall.ENOSPC { 
    log.Println("Out of disk space!") 
} 
+0

Aslında bu işe düşündüm, ama err' syscall.Errno' 'dönüştürülebilir olamaz' görünüyor :(Benim güncellenmiş soruma bakın – Unknown

+0

@Unknown Bu garip.Fmt.Printf ("% T", err) 'ın ne dediğini söyleyebilir misin? Hangi platformdasınız? – fuz

+0

Yukarıdaki çıktıda görebilirsiniz," err' bir "* os.PathError", Linux amd64'deyim. – Unknown

İlgili konular