๐Ÿ“œ โฌ†๏ธ โฌ‡๏ธ

Errors are values

(Translation of an article from the Go official blog)

A common theme among Go programmers, especially those who have just become acquainted with the language, is how to handle errors. Conversation often comes down to complaints that consistency
if err != nil {
    return err
}

. open-source , , , , . , ,
 if err != nil
, , , - , Go.

, . โ€” , Go, โ€” ยซ ?ยป, . , try-catch . , , try-catch , Go if err != nil. , Go , .

, , , Go : .

, , .

, - , , , , , boilerplate, , , , if.

bufio, Scanner. Scan -, , , . , Scan, . , boolean, , , , . :
scanner := bufio.NewScanner(input)
for scanner.Scan() {
    token := scanner.Text()
    // process token
}
if err := scanner.Err(); err != nil {
    // process the error
}

, nil, . , Scan
func (s *Scanner) Scan() (token []byte, error)

- ( , ),
scanner := bufio.NewScanner(input)
for {
    token, err := scanner.Scan()
    if err != nil {
        return err // or maybe break
    }
    // process token
}

, . , , API , โ€” API . API, : , . .

, , โ€” Scan -, false. , Err, , . , ,
if err != nil

. . , , .

, , , . , , , , .

, GoCon 2014 . -, @jxck_ , . , :
_, err = fd.Write(p0[a:b])
if err != nil {
    return err
}
_, err = fd.Write(p1[c:d])
if err != nil {
    return err
}
_, err = fd.Write(p2[e:f])
if err != nil {
    return err
}
// and so on

. , , , -, , , :
var err error
write := func(buf []byte) {
    if err != nil {
        return
    }
    _, err = w.Write(buf)
}
write(p0[a:b])
write(p1[c:d])
write(p2[e:f])
// and so on
if err != nil {
    return err
}

, , , , err ().

, , Scan, . , @jcxk_ , . , , , , .

errWriter, :
type errWriter struct {
    w   io.Writer
    err error
}

, write. Write , , . write Write Writer- :
func (ew *errWriter) write(buf []byte) {
    if ew.err != nil {
        return
    }
    _, ew.err = ew.w.Write(buf)
}

, write no-op, .

errWriter write, :
ew := &errWriter{w: fd}
ew.write(p0[a:b])
ew.write(p1[c:d])
ew.write(p2[e:f])
// and so on
if ew.err != nil {
    return ew.err
}

, , . . ( ) .

, , errWriter .

, errWriter , , . , . , . .

, . archive/zip net/http . , Writer bufio , , errWriter. bufio.Writer.Write , , , io.Writer. Write bufio.Writer , errWriter.write , Flush , :
b := bufio.NewWriter(fd)
b.Write(p0[a:b])
b.Write(p1[c:d])
b.Write(p2[e:f])
// and so on
if b.Flush() != nil {
    return b.Flush()
}

, , , , : , . , . , -- .

. , errWriter bufio.Writer โ€” , . , โ€” , Go .

, .

: , !

, @jxck_, , .

')

Source: https://habr.com/ru/post/269909/


All Articles