• Go语言中的Package问题


     问题一、Go使用Package组织源码的好处是什么?

    1.任何源码属于一个包

    2.用包组织便于代码的易读和复用

     

    问题二、Go语言中Package的种类

    Go语言中存在两种包、一种是可执行程序的包、一种是类库函数的包。

    可执行程序的包,编译完成后会生成一个可执行文件、静态库的包编译之后会生成一个.a为后缀的文件,自己不能执行只能被可执行包引用。

    可执行程序的包必须以main作为包名,静态库的包名没有要求。

    例如下面的实例:landlords存在如下几层结构 dal层、logic层、main以及proto层

    可以看到编辑后的结果是,生成了一个db.a数据库访问的库、redis.a 缓存访问的库、logic.a 业务逻辑层的库 以及一个proto.a 协议层的库(websocket.a 是由于引用了github.com下面的包),main包最终编译成了一个可执行文件。

    main包和其他类库通过静态链接,最终形成的可执行文件是没有任何外部依赖的。

    补充:如何生成一个静态库的包。

    打比方我创建了如下的项目,现在有这样一个包,我想要在main里面引用它。

    必须使用 go install 命令,生成一下package,发现报错了。因为我没有配置gopath,所以命令报错了。

    还有一个关键原因就是,我这个项目不是建立在GoPath下Src目录的,所以go install就用不了。

    这也是问题的关键,就是我们在创建项目的时候,需要先配置一个GoPath加入到环境变量当中,然后里面新建三个文件夹src、pkg以及bin文件夹,然后在src下面建立自己的项目。

    我把改项目,放到了一个GoPath的src目录下,重新go install之后,在对应的pkg文件夹下生成了 calc.a文件,如图所示。

     

    然后我们就可以在main中引用这个包了,如下:

    package main
    
    import ( 
        "PackageDemo/Calc" 
        "fmt" 
    ) 
    
    func main(){ 
        var a,b int = 3,1 
        var add = Calc.Add(a,b)
        var min = Calc.Min(a,b) 
        fmt.Println("Add result:",add) 
        fmt.Println("Min result",min) 
    } 

    问题三、包引用和init函数的执行顺序问题。

    一个包引用另一个包的初始化顺序,像下面的这个流程,main引用了add包,add包引用了sub包。

    是从底层还是初始化的。

     

    package add
    
    import (
       "fmt"
       "PackageDemo/sub"
    )
    
    func init(){
       fmt.Println("我是add包的init函数")
    }
    
    func Add(){
       sub.Sub()
    }
    

      

    package sub
    
    import "fmt"
    
    func init(){
      fmt.Println("我是sub包的init函数")
    }
    
    func Sub(){
      fmt.Println("")
    }
    

      

    package main
    
    import (
      "fmt"
      "PackageDemo/add"
    )
    
    func init(){
      fmt.Println("我是Main里面的init函数")
    }
    
    func main(){
       add.Add()
    }

    结果:

    我是sub包的init函数
    
    我是add包的init函数
    
    我是Main里面的init函数 
    

     

  • 相关阅读:
    深入Vue.js从源码开始(二)
    Vue.js的动态组件模板
    Vue中的methods、watch、computed
    Understand .sync in Vue
    vue程序中组件间的传值方式
    xUtils框架的介绍(一)
    xUtils框架的介绍(二)
    Java如何计算hashcode值
    Java网络编程总结
    深入Java线程管理(五):线程池
  • 原文地址:https://www.cnblogs.com/dcz2015/p/10763254.html
Copyright © 2020-2023  润新知