在go中导入包

时间:2012-10-17 00:27:14

标签: go

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

import "io/ioutil"

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

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

4 个答案:

答案 0 :(得分:48)

我想这并没有真正回答你的问题,但如果你愿意的话,你实际上可以在没有明确说明包的情况下调用方法 - 只需在名称前面导入.(但这不是推荐;见下文):

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更好的阅读/看到事物的来源。

答案 1 :(得分:31)

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

    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

答案 2 :(得分:7)

我不能真正代表Go语言的设计者,但很高兴能够快速分辨出你所调用的方法的定义。很高兴看到您在文件顶部使用的所有软件包的列表。这不是多余的。

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

答案 3 :(得分:0)

go中的导入语句不像Java中那样,更像c ++中的#include。在旅途中,如果未导入某些内容,则无法使用它。如果是导入的,则可以使用它,但必须以软件包名称作为前缀。就像其他人所说的,使用import . "packagename"导入软件包,而不必加前缀。