Cái gì '.' (dấu chấm hoặc dấu chấm) trong câu lệnh nhập Go làm gì?


135

Trong hướng dẫn Go và hầu hết mã Go tôi đã xem, các gói được nhập như thế này:

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

Nhưng trong http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go , gói gocheck được nhập với một .( dấu chấm ):

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

Ý nghĩa của .(thời kỳ) là gì?


22
Lưu ý, tôi đã thêm dấu chấm và dấu chấm vào câu hỏi để dễ tìm kiếm hơn.
Jared Farrish

Câu trả lời:


182

Nó cho phép các định danh trong gói đã nhập được tham chiếu trong khối tệp cục bộ mà không cần vòng loại.

Nếu một khoảng thời gian rõ ràng (.) Xuất hiện thay vì tên, tất cả các số nhận dạng được xuất của gói sẽ được khai báo trong khối tệp của tệp hiện tại và có thể được truy cập mà không cần vòng loại.

Giả sử chúng tôi đã biên dịch một gói chứa toán học gói mệnh đề gói, xuất hàm Sin và cài đặt gói đã biên dịch trong tệp được xác định bởi "lib / math". Bảng này minh họa cách Sin có thể được truy cập trong các tệp nhập gói sau các loại khai báo nhập khác nhau.

Import declaration          Local name of Sin

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

Tham chiếu: http://golang.org/doc/go_spec.html#Import_declarations


29
Cần lưu ý rằng nhóm Go không khuyến nghị sử dụng nhập dấu chấm. Nó có thể gây ra một số hành vi kỳ quặc trong một số trường hợp nhất định và có thể không có trong ngôn ngữ vô thời hạn.
jimt

Nó có thể gây nhầm lẫn trong một số tình huống, nhưng tôi không thể sử dụng go-linq. github.com/ahmetalpbalkan/go-linq
steviesama

Lưu ý rằng bạn vẫn không thể có quyền truy cập vào các chức năng không xuất (chức năng không viết hoa). Vì vậy, cách nhập khẩu này thực sự hút.
David Wong

1
Khi biên dịch chương trình bằng cách sử dụng nhập dấu chấm so với không sử dụng nhập dấu chấm. Có một lý do tại sao có sự khác biệt lớn nếu kích thước tập tin biên dịch? Sử dụng biên dịch nhập dấu chấm để kích thước lớn hơn.
majidarif

@majidarif: Đó là một quan sát thú vị :) Bạn có thể vui lòng gửi một câu hỏi riêng cho câu hỏi đó với mã tái tạo vấn đề không? (Tôi cố gắng để làm điều đó bản thân mình, soạn thảo một chương trình hello-thế giới đơn giản với import "fmt"vs import . "fmt", nhưng trong cả hai trường hợp đó là kích thước tương tự cho tôi.)
Attilio

66

Đây là một sự tương tự cho những người đến từ Python:

  • Go import "os"gần tương đương với Pythonimport os
  • Go import . "os"gần tương đương với Pythonfrom os import *

Trong cả hai ngôn ngữ, việc sử dụng ngôn ngữ sau thường được tán thành nhưng có thể có lý do chính đáng để thực hiện nó.


4

Điều này chỉ nên được sử dụng trong thử nghiệm.

Đây là một số tài liệu trong wiki của golang

Nếu bạn đã tạo một số mã giả như với mockgen và nó nhập mã gói của bạn, thì gói thử nghiệm của bạn cũng nhập mã gói của bạn, bạn sẽ có một phụ thuộc vòng tròn (Một cái gì đó golang chọn để cho phép người dùng quyết định cách giải quyết).

Tuy nhiên, nếu bên trong gói thử nghiệm của bạn, bạn sử dụng ký hiệu chấm trên gói bạn đang thử nghiệm thì chúng được coi là cùng một gói và không có phụ thuộc vòng tròn để có!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.