연기를 이해하려면 대안을 이해해야합니다. 많은 자원을 다루는 복잡한 코드에서
당신은이 (의사 코드) 같은 일을 결국 : 이것은 자세한 빨리 도착
mtx.Lock()
file1, err := os.Open(...)
if err != nil {
mtx.Unlock()
return err
}
conn, err := net.Dial(...)
if err != nil {
file1.Close()
mtx.Unlock()
return err
}
file2, err := os.Open(...)
if err != nil {
conn.Close()
file1.Close()
mtx.Unlock()
return err
}
do_things()
file2.Close()
conn.Close()
file1.Close()
mtx.Unlock()
return nil
. 또한 코드를 편집하고 file1을 열기 전에 네트워크 연결 열기를 이동하면 오류 처리 경로가 올바르게 업데이트되지 않을 수 있기 때문에 장기간에 오류가 발생하기 쉽습니다. C에서
, 여기에 공통 관용구는 함수의 끝에서 모든 리소스 정리를 수집하고이 같은 것을하는 것입니다 :
ret = ERROR;
lock(mtx);
fd1 = open(...);
if (fd1 == -1)
goto err1;
conn = net_conn(...);
if (conn == -1)
goto err2;
fd2 = open(...);
if (fd2 == -1)
goto err3;
do_things();
ret = 0;
close(fd2);
err3:
close(conn);
err2:
close(fd1);
err1:
unlock(mtx);
return ret;
이 꽤 중 하나되지 않습니다 그것은이를 얻기 위해 매우 쉽게 잘못도.
은 연기와 같은 일을하고 비교 우리가 얻을으로 : 그것은 이동이 발생하고 오해 또는 미래에 침입하는 것은 매우 어려운 것을 이해합니다 알고 명확하고 간결한, 사람의
mtx.Lock()
defer mtx.Unlock()
file1, err := os.Open(...)
if err != nil {
return err
}
defer file1.Close()
conn, err := net.Dial(...)
if err != nil {
return err
}
defer conn.Close()
file2, err := os.Open(...)
if err != nil {
return err
}
defer file2.Close()
.... do things ...
return nil
.
출처
2017-10-09 09:38:04
Art