2011-01-08 7 views
6

Google에서 Java finalize와 같은 메소드가 있습니까? 만약 내가 같은 형식의 구조체를 가지고있다Google go java equivalent of java finalize 메서드

type Foo struct { 
     f *os.File 
     .... 
    } 

func (p *Foo) finalize() { 
    p.f.close()   
} 

내가 가비지 수집 때 파일이 닫혀 있는지 어떻게 확인할 수 있습니까?

답변

6

runtime.SetFinalizer iirc. 하지만 나쁜 것으로 간주되고 프로그램 종료 전에 실행되도록 보장되지 않습니다.

EDIT : 아래에 언급했듯이 현재 os 패키지는 이미 파일에 runtime.SetFinalizer을 호출합니다. 그러나 SetFinalizer은 신뢰할 수 없습니다. 그 이유의 예로, 열린 파일을 닫는 것을 잊어 버린 파일 서버와 같은 응용 프로그램이 있습니다. 이 프로세스는 보통 GC가 파일을 선택하고 최종자를 호출하기 전에 약 300 개의 파일을 열어 보게됩니다.

+0

이 생성자는'런타임 호출 예를 들어, 만약 당신이 (자바)를했다. SetFinalizer' 그래서 gc'ed (프로그램 종료 때까지 언급되지 않았던 것처럼) 때 어쨌든 그것은 닫히게됩니다. 나만의 파이널 라이저를 제공 할 필요가 없습니다. – nos

+0

@ 노골적인 나는 그것을 깨닫는다. 나는 내 대답에 그것을 포함해야한다고 생각하지만 나는 내 전화에있다. – cthom06

+0

'SetFinalizer'를 사용하는 것은 나쁜 습관입니다. 대신 Dustin의 대답을 취하십시오 :'defer' 키워드를 사용하십시오. 자원 정리를 위해 설계되었습니다. – kirakun

15

자바에서는 그렇게하지 않을 것입니다. 자바에서 올바른 것은 finally 블록을 열어서 어딘가에 열어 놓은 블록을 닫는 것입니다.

defer 함수와 유사한 패턴을 사용하여 정리를 수행 할 수 있습니다.

try { 
    open(); 
    // do stuff 
} finally { 
    close(); 
} 

이동에서, 당신은이 작업을 수행 할 것입니다 : 당신이 명시 적으로 os.File을 닫지 않으면

open(); 
defer close(); 
// do stuff 
+2

'defer f.close()'는 잠재적으로 오류를 무시한다는 점에 유의하십시오. 파일에 쓰는 중이라면 중요 할 수 있습니다. 올바르게 수행하는 방법은 https://groups.google.com/d/msg/golang-nuts/GOd-rmqwAME/bPpqFPh9xkkJ 페이지를 참조하십시오. –

+3

글쎄, 확실하지만 가비지 컬렉터가 파일을 닫을 것을 기대하는 사람이라면 처음부터 안정성에별로 신경 쓰지 않아도됩니다. 나는 일반적으로 다른 선택의 여지가 없기 때문에 일반적으로 오류시 신경 쓰지 않습니다. – Dustin