7

Golang | Golang的包管理

 2 years ago
source link: https://jiac3366.github.io/2021/12/20/Golang/Golang%E5%8C%85%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

+c编程手记

Guangzhou, China
  • 01 ** | **GOPATH 有什么意义

    • GOPATH 每个目录都代表 Go 语言的一个工作区(workspace)

      Go 语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着 GOPATH 和工作区进行

      • Go 语言源码的组织方式

        • 一个代码包的导入路径实际上就是从 src 子目录,到该包的实际存储位置的相对路径
      • 了解源码安装后的结果

        • 安装后如果产生了可执行文件,就可能会放进该工作区的 bin 子目录

        • 安装后如果产生了归档文件(执行go install 后的.a文件,程序编译后生成的静态库文件/静态链接文件),就会放进该工作区的 pkg子目录

          • 生成的归档文件放置它的目录是:代码包的导入路径的直接父级 + pkg的平台相关目录 + 代码包目录img
      • 理解构建和安装 Go 程序的过程

        build和install都会执行编译、打包等操作 go build 不能生成包文件, go install 可以生成包文件

        • 构建 go build (主要意义在于测试)

          • 构建的是库源码文件,结果文件只会存在临时目录。

          • 构建的是命令源码文件,结果文件会在源码文件所在目录

        • 安装 go install (库源码文件?命令源码文件?)

          操作会先执行构建,然后还会进行链接操作,把结果文件搬运到指定目录

          • 安装的是库源码文件,结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中

          • 安装的是命令源码文件,结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量GOBIN指向的目录中

        • go get 相关

          (20条消息) go get命令_benben的博客-CSDN博客

          • 1、对代码包的远程导入路径进行自定义的方法是:在该代码包中的库源码文件的包声明语句的右边加入导入注释,
            例如:package semaphore // import “golang.org/x/sync/semaphore“,

          • 2、而加入导入注释之后,用以下命令即可下载并安装该代码包
            go get golang.org/x/sync/semaphore,Go 语言官网 golang.org 下的路径 /x/sync/semaphore 并不是存放semaphore包的真实地址。我们称之为代码包的自定义导入路径

  • 02丨命令源码文件

    • 命令源码文件是程序的运行入口,只能有一个,如果一个源码文件声明属于main包,并且包含一个无参数声明且无结果声明的main函数,那么它就是命令源码文件
      通过构建或安装命令源码文件,生成的可执行文件就可以被视为“命令”,既然是命令,那么就应该具备接收参数的能力。

    • 如果目录中有命令源码文件,那么其他种类的源码文件(同目录下的其他文件?)也应该声明属于main包

    • flag包

      • 在运行命令源码文件的时候传入参数,查看参数的使用说明imgimg

      • 自定义命令源码文件的参数使用说明

        • 场景:更灵活地定制命令参数容器,可以用 Go 编写命令,并可以让它们像众多操作系统命令那样被使用,甚至可以把它们嵌入到各种脚本中。

        • 在调用flag包中的一些函数(比如StringVar、Parse等等)的时候,实际上是在调用flag.CommandLine变量的对应方法。

        • 实践:自己创建一个私有的命令参数容器?

  • 03丨库源码文件

    库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序可以被其他代码使用

    • go build jiac_gateway/try03 –路径是相对于GOPATH的src的,同属于main包,1_lib里的函数不用大写也可以被1.go引用img

    • 库源码文件 1_lib.go 所在目录的相对路径是jiac_gateway/try_03_split/lib,而它却声明自己属于library包,如何导入?

      • 下面是需要弄清楚的,但写法不提倡,我们应该让声明的包名与其父目录的名称一致img

      • 1_lib.go首字母为大写的程序实体才可以被当前包外的代码引用

      • go除了包权限规则,还可以通过创建internal代码包让代码仅仅能被当前模块中的其他代码引用(模块级私有)

        • 如导入两个代码包,而这两个代码包的导入路径的最后一级是相同的,比如:dep/lib/flag和flag,怎样解决这种冲突,有几种方式?
          • A:导入代码包的时候给它起一个别名就可以了,比如: import libflag “dep/lib/flag”。或者,以本地化的方式???导入代码包,如:import . “dep/lib/flag”(”dep/lib/flag”包中公开的程序实体,会被视为当前代码包中的程序实体,eg: 导入语句import . fmt,直接用Printf就可以)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK