41

Goプログラミング言語で、パッケージをインポートした後でも、そのパッケージ内のメソッドの前にパッケージ名を付ける必要があるのはなぜですか?

すなわち

import "io/ioutil"

func main() { 
    content, err = iotuil.ReadFile("somefile.txt")
    // etc..
}

これは冗長ではありませんか?たとえば、Javaでは、インポートしFiles.readAllLinesなくてもインポートなどを行うことができますFiles

4

4 に答える 4

57

これは実際にはあなたの質問に答えないと思いますが、必要に応じて、パッケージを明示的に指定せずに実際にメソッドを呼び出すことができます-.名前の前にを付けてインポートするだけです(ただし、これはお勧めしません。以下を参照してください)。

package main

import (
  . "fmt"
  . "io/ioutil"
)

func main () {
  content, err := ReadFile("testfile")
  if err != nil {
    Println("Errors")
  }
  Println("My file:\n", string(content))
}

以下の@jimtのコメントに注意してください。この方法は、将来のリリースと名前の競合を引き起こす可能性があるため、テスト以外ではお勧めできません。また、@ DavidGraysonの、物事がどこから来ているのかを読んだり見たりするのがより良いという点に間違いなく同意します。

于 2012-10-17T01:03:07.990 に答える
36

パッケージ名をインポートして名前を変更できます。例:

    import (  
        .     "fmt"       // no name, import in scope  
        File  "io/ioutil" // rename ioutil to File
        _     "net"       // net will not be available, but init() inside net package will be executed
    )

https://golang.org/ref/spec#Import_declarationsも参照してください

于 2012-10-17T02:35:52.897 に答える
8

Go言語の設計者については実際に話すことはできませんが、呼び出しているメソッドがどこで定義されているかをすばやく知ることができるのは素晴らしいことです。使用しているすべてのパッケージのリストがファイルの先頭に表示されるのも便利です。これは冗長ではありません。

あなたが言ったように、Javaはあなたが言うことをFiles.readAllLines要求し、同様にgoはあなたが書くことを要求しますioutil.ReadFile

于 2012-10-17T00:43:45.980 に答える
0

#includegoのインポートステートメントは、Javaの場合とは異なり、 C++の場合と同様です。外出先では、何かがインポートされていない場合、それを使用することはできません。インポートされた場合は使用できますが、プレフィックスとしてパッケージ名を付ける必要があります。他のみんなが言ったようimport . "packagename"に、パッケージをインポートするために使用し、プレフィックスを付ける必要はありません。

于 2018-10-15T14:00:40.767 に答える