Que fait le '.' (point ou point) dans une instruction d'importation Go?

135

Dans le didacticiel Go, et dans la plupart du code Go que j'ai examiné, les packages sont importés comme suit:

import (
    "fmt"
    "os"
    "launchpad.net/lpad"
    ...
)

Mais dans http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go , le paquet gocheck est importé avec un .(point):

import (
    "http"
    . "launchpad.net/gocheck"
    "launchpad.net/lpad"
    "os"    
)

Quelle est la signification de la .(période)?

Eric Seidel
la source
22
Notez que j'ai ajouté un point et un point à la question pour faciliter la recherche.
Jared Farrish

Réponses:

182

Il permet aux identificateurs du package importé d'être référencés dans le bloc de fichiers local sans qualificatif.

Si un point explicite (.) Apparaît à la place d'un nom, tous les identificateurs exportés du package seront déclarés dans le bloc de fichiers du fichier actuel et seront accessibles sans qualificatif.

Supposons que nous ayons compilé un package contenant la clause package package math, qui exporte la fonction Sin, et installé le package compilé dans le fichier identifié par "lib / math". Ce tableau illustre comment Sin est accessible dans les fichiers qui importent le package après les différents types de déclaration d'importation.

Import declaration          Local name of Sin

import   "lib/math"         math.Sin
import M "lib/math"         M.Sin
import . "lib/math"         Sin

Réf: http://golang.org/doc/go_spec.html#Import_declarations

Tvanfosson
la source
29
Il est à noter que l'équipe Go ne recommande pas l'utilisation de l'importation de points. Cela peut provoquer un comportement étrange dans certains cas et peut ne pas être indéfiniment dans la langue.
jimt
Cela peut être déroutant dans certains scénarios, mais je ne pouvais pas le supporter en utilisant go-linq. github.com/ahmetalpbalkan/go-linq
steviesama
Notez que vous ne pouvez toujours pas accéder aux fonctions non exportées (fonctions non majuscules). Donc, cette façon d'importer est vraiment nul.
David 天宇 Wong
1
Lors de la compilation d'un programme à l'aide de l'importation de points et de ne pas utiliser l'importation de points. Y a-t-il une raison pour laquelle il y a une énorme différence entre la taille du fichier compilé? L'utilisation de l'importation de points compile à une taille plus grande.
majidarif
@majidarif: C'est une observation intéressante :) Pourriez-vous s'il vous plaît poster une question distincte pour cela avec un code qui reproduit le problème? (J'ai essayé de le faire moi-même, en compilant un simple programme hello-world avec import "fmt"vs import . "fmt", mais dans les deux cas, c'était la même taille pour moi.)
Attilio
66

Voici une analogie pour ceux qui viennent de Python:

  • Go import "os"est à peu près équivalent à Pythonimport os
  • Go import . "os"est à peu près équivalent à Pythonfrom os import *

Dans les deux langues, l'utilisation de ce dernier est généralement mal vue, mais il peut y avoir de bonnes raisons de le faire.

Evan Shaw
la source
4

Cela ne doit être utilisé que pour les tests.

Voici de la documentation sur le wiki de Golang

Si vous avez généré un code fictif comme avec mockgen et qu'il importe votre code de package, puis que votre package de test importe également votre code de package, vous obtenez une dépendance circulaire (quelque chose que golang choisit de laisser l'utilisateur décider comment résoudre).

Cependant, si dans votre package de test, vous utilisez la notation par points sur le package que vous testez, ils sont traités comme le même package et il n'y a pas de dépendance circulaire à avoir!

Eli Davis
la source