La fonction Quel type d'objets sont finalisés par défaut? P>
Quels sont certains des pièges imprévus causés par les objets finalisés par défaut? P> runtime.setFinalizer (x, f Interface {}) < / code> Définit le finaliseur associé à
x code> sur
f code>. p>
3 Réponses :
Les objets suivants sont finalisés par défaut:
os.file code>
: le fichier est automatiquement fermé lorsque l'objet est recruté. p>
li>
OS.Process code>
: 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. P>
li>
sous Windows, il apparaît que le package net code>
peut fermer automatiquement une connexion réseau. P>
li>
ul>
La bibliothèque de go standard ne paramètre pas de finaliseur sur des types d'objets autres que ceux mentionnés ci-dessus. P>
Il semble y avoir un seul problème potentiel pouvant causer des problèmes dans les programmes réels: quand Un impression: p> os.file code> est finalisé, il apportera un appel au système d'exploitation pour fermer le descripteur de fichier. Si le fichier
os.file code> a été créé en appelant la fonction
os.newfile (fd int, chaîne de noms) * Fichier code> et le descripteur de fichier est également utilisé par un autre (différent)
OS.FILE CODE>, puis la collecte des ordures l'un des objets de fichier rendra l'autre objet de fichier inutilisable. Par exemple: p>
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 code>
@jnml: OS.FILE.FLOSE () La fonction ne fonctionne pas du tout b> 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".
"quel type d'objets sont finalisés par défaut?" em> "Quels sont certains des pièges imprévus causés par les objets finalisés par défaut?" em>
Rien à partir est imo finalisé par défaut em>. P>
Selon ci-dessus: Aucun. P>
Ê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 b>.
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 i> définir un finaliseur dans le code de paquet. Rien à partir, ni dans une bibliothèque n'est " finalisée par défaut i>".
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 }
Notez les nombreuses mises en garde énumérées dans le
runtime.setFinalizer code> Documentation
. Vous devriez jamais i> dépendre de ou attendez-vous à un finisseur à jamais i> get. Au lieu de cela, toujours i> Assurez-vous d'appeler la ou les fonctions de nettoyage appropriées (par exemple,fichier de différer.close () code> juste après avoir vérifié les erreurs de
Os.open code>).