2012-11-09 13 views
8

Trong các ngôn ngữ hướng đối tượng, tôi sử dụng các biến lớp để theo dõi số lượng các cá thể hiện đang sinh ra bằng cách tăng lên khi xây dựng và giảm về sự hủy diệt.Làm thế nào để theo dõi số lượng phiên bản của một loại?

tôi cố gắng thực hiện hành vi tương tự trong đi:

package entity 

type Entity struct { 
    Name string 
} 

func New(name string) Entity { 
    entity := Entity{name} 
    counter++ 
    return entity 
} 

var counter int = 0 

func (e *Entity) Count() int { 
    return counter 
} 

và làm việc nửa đường như tôi không thể giảm các truy cập qua một destructor.

Tôi bằng cách nào đó có thể bắt chước sự phá hủy đối tượng không? Tôi làm cách nào để theo dõi số lần hiển thị chính xác?

+0

Có phương pháp tích hợp để hiển thị số lượng tham chiếu trên một đối tượng không? –

Trả lời

9

Bạn có thể sử dụng runtime.SetFinalizer như thế này. Xem here cho phiên bản sân chơi.

package main 

import (
    "fmt" 
    "runtime" 
) 

type Entity struct { 
    Name string 
} 

var counter int = 0 

func New(name string) Entity { 
    entity := Entity{name} 
    counter++ 
    runtime.SetFinalizer(&entity, func(_ *Entity) { 
     counter-- 
    }) 
    return entity 
} 

func (e *Entity) Count() int { 
    return counter 
} 

func main() { 
    e := New("Sausage") 
    fmt.Println("Entities", counter, e) 
    e = New("Potato") 
    fmt.Println("Entities", counter, e) 
    runtime.GC() 
    fmt.Println("Entities", counter) 
    e = New("Leek") 
    fmt.Println("Entities", counter) 
    runtime.GC() 
    fmt.Println("Entities", counter) 
} 

này in

Entities 1 {Sausage} 
Entities 2 {Potato} 
Entities 0 
Entities 1 
Entities 0 

Chú giải này từ các tài liệu cho gotchas với bộ hoàn thiện

Các finalizer cho x được lên kế hoạch để chạy một lúc nào tùy ý sau khi x trở nên không thể truy cập. Không có đảm bảo rằng finalizers sẽ chạy trước khi thoát khỏi chương trình, vì vậy thông thường chúng chỉ hữu ích cho giải phóng tài nguyên không nhớ được liên kết với một đối tượng trong một chương trình dài hạn .

+0

+1 Tôi đã sai khi tôi không thấy chức năng mới này –

5

Có một số discussion trên golang-nut về finalizers.

Còn bây giờ,

  • không có chức năng finalizer (chỉnh sửa: không có chức năng finalizer đáng tin cậy, như đã được chứng minh là tôi bởi Nick)
  • GC không sử dụng và không duy trì bất kỳ số tham chiếu nào

Vì vậy, bạn phải quản lý số lượng cá thể của mình.

Thông thường, bạn không có cá thể sống, vì vậy đối với nhiều ứng dụng thực tế (không bao gồm lược tả chương trình phức tạp và khó hiểu), bạn có thể sử dụng defer để theo dõi thời gian kết thúc của biến. Tôi sẽ không giả vờ điều này thực sự thay thế finalizers nhưng nó đơn giản và thường đủ.