web-dev-qa-db-fra.com

Que fait le '.' (point ou point) dans une déclaration d'importation Go faire?

Dans le didacticiel Go, et 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 package gocheck est importé avec un . (période):

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

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

126
Eric Seidel

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

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

Supposons que nous avons 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

170
tvanfosson

Voici une analogie pour ceux qui viennent de Python:

  • Allez import "os" est à peu près équivalent à Python import os
  • Allez import . "os" est à peu près équivalent à Python from os import *

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

64
Evan Shaw

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

Voici une documentation dans le wiki de golang

Si vous avez généré du 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 de golang choisit de laisser l'utilisateur décider de la résolution).

Cependant, si à l'intérieur de 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 aucune dépendance circulaire à avoir!

3
Eli Davis