在go中导入包

Ste*_*eve 33 go

在go编程语言中,为什么在导入包之后我仍然必须在包中使用包名称作为方法的前缀?

import "io/ioutil"

func main() { 
    content, err = iotuil.ReadFile("somefile.txt")
    // etc..
}
Run Code Online (Sandbox Code Playgroud)

这不是多余的吗?例如,在Java中,您可以在不导入文件的情况下执行Files.readAllLines等操作.

Roc*_*key 48

我想这并没有真正回答你的问题,但如果你愿意,你可以实际调用方法而不明确说明包 - 只需.在名称前导入(但不建议这样做;见下文):

package main

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

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

注意@jimt的评论如下 - 在测试之外建议这种做法,因为它可能导致与未来版本的名称冲突.此外,绝对同意@DavidGrayson更好的阅读/看到事物的来源.

  • 应该注意的是,点导入不被视为良好做法.来自[golang.org](http://golang.org/doc/go1compat.html):如果程序使用`import导入标准包."path"`,在将来的版本中导入的包中定义的其他名称可能与程序中定义的其他名称冲突.我们不建议在测试之外使用`import .`,并且使用它可能会导致程序在将来的版本中无法编译. (10认同)
  • 如果 golang.org 反对导入 . 他们应该将“路径”从语言中删除。为什么用于测试是一件好事(“测试之外......”)?现在测试不是永远保存吗?还有 . import,正是 Java 中每个 import 语句所做的事情。事实上,这就是 Java 中所有 import 语句所做的事情。我没有看到太多没有执行“.import”的java代码。 (2认同)
  • 如果我错了,请纠正我,但是如果你有一个项目特定的代码,你分散在你的主程序包中你可能拥有的多个文件,它不会造成任何伤害.但是标准和第三方库应该具有名称空间前缀以避免命名冲突. (2认同)

小智 32

您可以导入和重命名包名称,例如:

    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
    )
Run Code Online (Sandbox Code Playgroud)

另请参见https://golang.org/ref/spec#Import_declarations


Dav*_*son 7

我不能真正代表Go语言的设计者,但很高兴能够快速告诉您调用方法的位置.很高兴看到您在文件顶部使用的所有软件包的列表.这不是多余的.

正如你所说,Java要求你说Files.readAllLines并且同样需要你写ioutil.ReadFile.

  • Files.readAllLines中的文件不是包名.它是用于调用静态方法的类名.Files的包是java.nio.file,所以没有导入java.nio.file.Files; 你不得不说:java.nio.file.Files.readAllLines() (2认同)