9
votes

Quels objets sont finalisés par défaut et quels sont certains des pièges de celui-ci?

La fonction runtime.setFinalizer (x, f Interface {}) < / code> Définit le finaliseur associé à x sur f .

Quel type d'objets sont finalisés par défaut?

Quels sont certains des pièges imprévus causés par les objets finalisés par défaut?


1 commentaires

Notez les nombreuses mises en garde énumérées dans le runtime.setFinalizer Documentation . Vous devriez jamais dépendre de ou attendez-vous à un finisseur à jamais get. Au lieu de cela, toujours Assurez-vous d'appeler la ou les fonctions de nettoyage appropriées (par exemple, fichier de différer.close () juste après avoir vérifié les erreurs de Os.open ).


3 Réponses :


11
votes

Les objets suivants sont finalisés par défaut:

  • os.file : le fichier est automatiquement fermé lorsque l'objet est recruté.

  • OS.Process : finalisation Relâchez des ressources associées au processus. Sur UNIX, il s'agit d'aucune opération. Sous Windows, il ferme la poignée associée au processus.

  • sous Windows, il apparaît que le package net peut fermer automatiquement une connexion réseau.

    La bibliothèque de go standard ne paramètre pas de finaliseur sur des types d'objets autres que ceux mentionnés ci-dessus.

    Il semble y avoir un seul problème potentiel pouvant causer des problèmes dans les programmes réels: quand Un os.file est finalisé, il apportera un appel au système d'exploitation pour fermer le descripteur de fichier. Si le fichier os.file a été créé en appelant la fonction os.newfile (fd int, chaîne de noms) * Fichier et le descripteur de fichier est également utilisé par un autre (différent) OS.FILE , puis la collecte des ordures l'un des objets de fichier rendra l'autre objet de fichier inutilisable. Par exemple: xxx

    impression: xxx


3 commentaires

Le code ci-dessus collé inchangé à la fois aux terrains de jeux de Golang.org.Golang.org imprimés dans les deux cas: du texte


@jnml: OS.FILE.FLOSE () La fonction ne fonctionne pas du tout dans les terrains de jeu pour une raison quelconque. Voir play.golang.org/p/qnj8lrxqny


À partir de Go 1.4.2 (et probablement plus tôt) Cet exemple fonctionne bien. On ne sait pas si le finaliseur n'est pas appelé ou s'il est appelé et maintenant "fait la bonne chose".



-4
votes

"quel type d'objets sont finalisés par défaut?"

Rien à partir est imo finalisé par défaut .

"Quels sont certains des pièges imprévus causés par les objets finalisés par défaut?"

Selon ci-dessus: Aucun.


4 commentaires

Êtes-vous en mesure de créer un programme Go qui ouvre un fichier et le fichier renvoyé * OS.FILE est désactivé (sans modifier le code source des packages standard de Go)? Si vous ne pouvez pas faire cela, cela signifie que toutes les instances d'OS.FILE sont finalisées par défaut .


Je parle d'aller, pas sur une bibliothèque.


Je parle d'aller dans son ensemble (y compris les paquets standard).


@Atom: toujours la même chose. * os.file est finalisé par explicitement définir un finaliseur dans le code de paquet. Rien à partir, ni dans une bibliothèque n'est " finalisée par défaut ".



5
votes

Il suffit de sauter dans le code source STRAND> OS.Newfile Strong> Source:

// NewFile returns a new File with the given file descriptor and name.
func NewFile(fd uintptr, name string) *File {
    fdi := int(fd)
    if fdi < 0 {
        return nil
    }
    f := &File{&file{fd: fdi, name: name}}
    runtime.SetFinalizer(f.file, (*file).close)  // <<<<<<<<<<<<<<
    return f
}
  • Lorsque Go exécute GC, il exécutera des finaliseurs liés à cet objet. LI>
  • Lorsque vous ouvrez un nouveau fichier, la bibliothèque GO sera un finaliseur sur cet objet renvoyé pour vous. LI>
  • Lorsque vous n'êtes pas sûr de ce que le GC fera à cet objet, passez au code source et vérifiez si la bibliothèque a défini des finaliseurs sur cet objet. LI> ul> p>


0 commentaires