Updated:

less than 1 minute read

개요

  • 일반적으로 finalizer 함수는 해당 오브젝트가 가비지 컬렉션되기 전에 실행
  • 하지만 실행이 보장되지 않으므로 오브젝트의 소멸자로 사용하는 것은 의도하지 않은 동작을 초래
  • finalizer에서 리소스가 해제된다면 버그라고 볼 수 있음
  • 리소스 릭을 최소화하거나 버그를 발견하고자 할 때 사용


예제

  • 코드
    •  package main
              
       import (
           "runtime"
       )
              
       type Test struct {
           i int
       }
              
       func main() {
           finalizer := func(test *Test) { println("~~~ ", test.i) }
              
           for i := 0; i < 10; i++ {
               test := Test{i: i}
               runtime.SetFinalizer(&test, finalizer)
           }
              
           runtime.GC()
       }
      
  • 실행 결과
    •  ~~~  7
       ~~~  6
       ~~~  5
       ~~~  4
       ~~~  3