Go与Java中package的理解与区别 - Go语言中文社区

Go与Java中package的理解与区别


一.GO中package的使用

  1.  package是go程序中最基本的分发单位和工程管理中依赖关系的体现,一个"xx.go"源文件必须属于某个package,一个package可以拆成多个".go"源文件;
  2. 每个".go"源代码文件开头都拥有一个package声明,表示该源代码所属的package;
  3. 要生成golang可执行程序(bin目录下),必须建立一个名为main的package,并且在该package中必须包含一个名为main()的函数;
  4. 在go工程中,同一个路径下只能存在一个package
  5. 一个package中可以有一个main()函数,该main()函数可以放在package中的任一".go"源文件中

 需要注意的是

  • 在go中使用关键字"import"导入的只是是某个package所在的路径,而并不是实际的package.由于同一个路径下只能存在一个package,而由于惯例经常将目录名与该目录下的package名设为一致,所以会给人造成"improt"后的是package名,而实际上目录名与该目录下的package名是可以不同的,"import"后跟的是目录名;
  • 在程序中正真使用时,才要用到package名
  • 总之,"import"后跟的是目录名,而程序中使用的是package名,两者可以不同,而习惯上我们把目录名和该目录下的包名设为一样;另外,不得导入源代码文件中没有用到的package路径,否则go编译器会报编译错误
package main

import (
    "fmt"  //-------->这里的"fmt"是fmt包所在的目录名
)


func mian() {
    fmt.println("hello") //-------> 这里的"fmt"是fmt包
}

二.go的"import"原理

       如果编译时main包导入了其他的包,那么这些包将被依次导入。

       当一个包被导入时,如果该包还导入了其它的包,那么先将其他的包导入进来,然后再对该包的包级常量和变量进行初始化,最后执行init函数(如果存在)。包的导入如上图所示,是一个递归地过程,等所有被导入的包加载完毕,就会对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在),最后执行main函数。

       如果一个包被多个包同时导入,那么它只会被导入一次。

 

三.Go的"import"语法

风格一

import "package1"
import "package2"
import "package3"
...

风格二

import (
    "package1"
    "package2"
    "package3"
    ...
)
  • 点(.)操作

  点(.)操作的含义是:点(.)标识的包导入后,调用该包中函数时可以省略前缀包名。点(.)操作的语法为:

import . "package1"
import . "package2"
import . "package3"
...
import (
    . "package1"
    . "package2"
    . "package3"
    ...
)

   下面的示例中,fmt包将使用点操作省略前缀包名,os包用法保持不变:

package main

import (
    . "fmt"
    "os"
)

func main() {
    for _, value := range os.Args {
        Println(value)
    }
}
  • 别名操作

  别名操作的含义是:将导入的包命名为另一个容易记忆的别名。别名操作的语法为:

import p1 "package1"
import p2 "package2"
import p3 "package3"
...
import (
    p1 "package1"
    p2 "package2"
    p3 "package3"
    ...
)

       下面的示例中,fmt包将使用别名操作重新命名为f,os包用法保持不变:

package main

import (
    f "fmt"
    "os"
)

func main() {
    for _, value := range os.Args {
        f.Println(value)
    }
}

• 下划线(_)操作

       下划线(_)操作的含义是:导入该包,但不导入整个包,而是执行该包中的init函数,因此无法通过包名来调用包中的其他函数。使用下划线(_)操作往往是为了注册包里的引擎,让外部可以方便地使用。下划线(_)操作的语法为:

import _ "package1"
import _ "package2"
import _ "package3"
...
import (
    _ "package1"
    _ "package2"
    _ "package3"
    ...
)

四.Java中的package与"import"

  1. Java中的package是组织和管理类文件(xx.java)的一个层级,最终实际上会转换为文件系统中的一个目录文件,可以理解为Java中的package就是个目录文件
  2. 一个package中可以管理多个".java"源文件
  3. Java中的"import"导入的不是包而是某个包中的某个类或所有类

 总之,Java中的package实际上就可以理解为文件名,"import"导入的是包中(文件中)的某个类(.java文件);而go总的package不是指文件,但一个文件中只能有一个package,一个package组织多个".go"源文件,"import"导入的是文件而不是包,而程序中实际使用的是包

 参考来源:golang之package   Go包导入与Java的差别

  

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/jt102605/article/details/82054689
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 11:41:58
  • 阅读 ( 1677 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢