首页 > 其他分享 >Go语言精进之路读书笔记第16条——理解Go语言的包导入

Go语言精进之路读书笔记第16条——理解Go语言的包导入

时间:2024-02-07 17:44:06浏览次数:28  
标签:包名 xxx 语言 读书笔记 路径 编译 导入 Go

Go编译速度快的原因主要体现在以下三方面:

  • Go要求每个源文件在开头处显式地列出所有依赖的包导入,这样Go编译器不必读取和处理整个文件就可以确定其依赖的包列表。
  • Go要求包之间不能存在循环依赖。这样一个包的依赖关系便形成了一张有向无环图。由于无环,包可以被单独编译,也可以并行编译。
  • 已编译的Go包对应的目标文件中不仅记录了该包本身的导出符号信息,还记录了其所依赖包的导出符号信息。

16.1 Go程序构建过程

Go程序的构建简单来讲也是由编译(compile)和链接(link)两个阶段组成的。

16.2 究竟是路径名还是包名

编译器在编译的过程中必然要使用的编译单元(一个包)所依赖的包的源码。

基础搜索路径是一个全局的设置

  1. 所有包(无论是标准库包还是第三方包)的源码基础搜索路径都包括$GOROOT/src

  2. 在上述基础搜索路径的基础上,不同版本的Go包含的其他基础搜索路径有不同,Go 1.13版本有两种模式

    1. 经典gopath模式(GO111MODULE=off):$GOPATH/src
    2. module-aware模式下(GO111MODULE=on/auto):$GOPATH/pkg/mod

未来的Go版本将只有module-aware模式

包导入路径位于每个包源码文件头部

源文件头部的包导入语句import后面的部分就是一个路径,路径的最后一个分段也不是包名。不过Go语言有一个惯用法,那就是包导入路径的最后一段目录名最好与包名一致。

当包名与包导入路径中的最后一个目录名不同时,最好用下面的语法将包名显式放入包导入语句中:

mypkg2 "xxx.com/xxx/pkg/pkgs"

16.3 包名冲突问题

包名冲突问题通过为包导入路径下的包显式指定包名来解决

pkg1 "xxx.com/xxx/pkg/chapter3-demo1/pkg1"
mypkg1 "xxx.com/xxx/pkg/chapter3-demo2/pkg1"

标签:包名,xxx,语言,读书笔记,路径,编译,导入,Go
From: https://www.cnblogs.com/brynchen/p/18011138

相关文章

  • Django知识笔记1
    本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计RESTAPI,通过使用Django来实现一个RESTAPI为例,明确后端开发RESTAPI要做的最核心工作,然后介绍DjangoRESTframework能帮助我们简化开发RESTAPI的工作。Web应用模式在开发Web应用中,有两种应用模式:前后端不分离......
  • C语言解题 || 计算数字矩阵的2条对角线之和
    题目:写一个函数calc_matrix(intn)实现如下功能:先输入整数n,然后输入nn个整数,构成nn矩阵,计算对角线上的数之和,并输出该和。例如:先输入3,然后输入1,2,3,4,5,6,7,8,9对角线上是数之和为:1+5+9+3+7=25。写出完整的程序代码,在main函数中调用上述函数calc_matrix题目分析:通过研究数......
  • Go语言精进之路读书笔记第14条——了解map实现原理并高效使用
    14.1什么是mapmap对value的类型没有限制,但是对key的类型有严格要求:key的类型应该严格定义了作为“==”和“!=”两个操作符的操作数时的行为,因此func、map、slice、chan不能作为map的key类型。map类型不支持“零值可用”,未显式赋初值的map类型变量的零值为nil。对处于零值状态的......
  • golang类型转换模块之gconv
    gf框架提供了非常强大的类型转换包gconv,可以实现将任何数据类型转换为指定的数据类型,对常用基本数据类型之间的无缝转换,同时也支持任意类型到struct对象的属性赋值。由于gconv模块内部大量使用了断言而非反射(仅struct转换使用到了反射),因此执行的效率非常高。使用方式:import"g......
  • Go语言的For循环:语法全解析
    Go语言,作为一门旨在提供简洁、高效编程体验的编程语言,其循环结构的设计同样体现了这一理念。在Go中,for循环是唯一的循环语句,但它的灵活性足以应对各种迭代需求。本文将详细介绍Go语言中for循环的语法,通过示例展示其在实际编程中的应用。基本语法Go语言的for循环基本语法如下:for初......
  • 详解golang实现一个带时效的环形队列
    1.需求mysql执行时间超过100ms以上打warn日志,但是一分钟以内这种warn日志超过10条就需要告警。所以需求就是获得一分钟以内mysql的warn的个数。2.分析为什么使用环形队列而不使用slice?因为队列长度固定,所以可以一开始就分配好空间,不用自动扩容,环形的目的就是不用改变数组的值,只用移......
  • Go语言的100个错误使用场景(30-40)|数据类型与字符串使用
    目录前言4.控制结构4.1忽视元素在range循环中是拷贝(#30)4.2忽略在range循环中如何评估表达式(#31)4.3忽略在range中使用指针元素的影响(#32)4.4对map遍历的错误假设(#33)4.5忽略break的作用(#34)4.6在循环中使用defer(#35)5.字符串5.1不理解rune的概念(#36)5.2不准确的字......
  • golang定时器之timer+ticker
    转载: https://juejin.cn/post/7327157426298011663 Timer是一个一次性的定时器,用于在未来的某一时刻执行一次操作。基本使用创建Timer定时器的方式有两种:NewTimer(dDuration)*Timer:该函数接受一个time.Duration类型的参数d(时间间隔),表示定时器在过期之前等待的......
  • Go语言精进之路读书笔记第13条——了解切片实现原理并高效使用
    13.1切片究竟是什么Go数组是值语义的,这意味着一个数组变量表示的是整个数组,对于元素类型长度较大或元素个数较多的数组,如果直接以数组类型参数传递到函数中会有不小的性能损耗。这时很多人会使用数组指针来定义函数参数,但在Go语言中,更地道的方式是使用切片。切片之于数组就像......
  • golang之常用标准库汇总
    1.import"runtime/debug"func StackfuncStack()[]byteStack 返回格式化的go程的调用栈踪迹。 对于每一个调用栈,它包括原文件的行信息和PC值;对go函数还会尝试获取调用该函数的函数或方法,及调用所在行的文本。 func PrintStackfuncPrintStack()PrintStack将Stack......