41

在 Go 编程语言中,为什么在导入包后,我仍然必须在该包中的方法前面加上包名?

IE

import "io/ioutil"

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

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

4

4 回答 4

57

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

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

go 中的 import 语句不像 java 中的,更像#include是 c++ 中的。在go中,如果没有导入某些内容,则无法使用它。如果是导入的,你可以使用它,但必须以包名作为前缀。正如其他人所说,用于import . "packagename"导入包而不必前缀。

于 2018-10-15T14:00:40.767 回答