在go编程语言中,为什么在导入包之后我仍然必须在该包中使用包名称作为前缀?
即
import "io/ioutil"
func main() {
content, err = iotuil.ReadFile("somefile.txt")
// etc..
}
这不是多余的吗?例如,在Java中,您可以在不导入文件的情况下执行Files.readAllLines等操作。
答案 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
)
答案 2 :(得分:7)
我不能真正代表Go语言的设计者,但很高兴能够快速分辨出你所调用的方法的定义。很高兴看到您在文件顶部使用的所有软件包的列表。这不是多余的。
正如你所说,Java要求你说Files.readAllLines
,同样需要你写ioutil.ReadFile
。
答案 3 :(得分:0)
go中的导入语句不像Java中那样,更像c ++中的#include
。在旅途中,如果未导入某些内容,则无法使用它。如果是导入的,则可以使用它,但必须以软件包名称作为前缀。就像其他人所说的,使用import . "packagename"
导入软件包,而不必加前缀。