ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2.14 Go之包的概念

2022-02-28 10:04:51  阅读:176  来源: 互联网

标签:包名 之包 package fmt 导入 引用 Go import 2.14


2.14 Go之包的概念

包的基本概念

  1. Go使用包组织源代码。

  2. 包(package)是多个Go源码的集合,是一种高级的代码复用方案。

  3. 任何源代码文件必须属于某个包,同时源码文件的第一行有效代码必须是package pacakgeName语句,通过该语句声明自己所在的包。

包名的特点:

目录树的组织形式,一般包的名称就是其源文件所在目录的名称。Go语言没有强制要求包名必须和其所在的目录名同名,但还是建议包名和所在目录同名

GOPATH/src/a/b/下定义一个包c。在包c的源码中只需声明为package c,而不是声明为package a/b/c,但是在导入c包时,需要带上路径,例如import "a/b/c"

包的习惯用法

  • 包名一般是小写的,使用一个简短且有意义的名称。

  • 包名一般要和所在的目录同名,也可以不同,包名中不能包含-等特殊符号。

  • 包一般使用域名作为目录名称,这样能保证包名的唯一性,比如GitHub项目的包一般会放到GOPATH/src/github.com/userName/projectName目录下。

  • 包名为main的包为应用程序的入口包,编译不包含main包的源码文件时不会得到可执行文件。

  • 一个文件夹下的所有源码文件只能属于同一个包,同样属于同一个包的源码文件不能放在多个文件夹下。

包的导入

语法:

import "包的路径"

注意:

  • import 导入语句通常放在源码文件开头包声明语句的下面;

  • 导入的包名需要使用双引号包裹起来;

  • 包名是从GOPATH/src/后开始计算的,使用/进行路径分隔。

包导入的方法:

  • 单行导入

  • 多行导入


单行导入:

import "包 1 的路径"
import "包 2 的路径"

多行导入:

import (
   "包 1 的路径"
   "包 2 的路径"
)
包的导入路径
  • 全路径导入

  • 相对路径导入


全路径导入:

import "lab/a"

相对路径导入:

import "../a"

包的引用格式

  1. 标准引用格式

  2. 自定义别名引用格式

  3. 省略引用格式

  4. 匿名引用格式

标准引用格式
import "fmt"

包方法调用:

package main
import "fmt"
func main() {
   fmt.Println("Lucifer")
}
自定义别名引用格式

导入包时为包设置别名:

import F "fmt"

包方法调用:

package main
import F "fmt"
func main() {
F.Println("Lucifer")
}
省略引用格式
import ."fmt"

示例代码:

package main
import . "fmt"
func main() {
//不需要加前缀 fmt.
Println("Lucifer")
}
匿名引用格式

特点: 在引用某个包时,如果只是希望执行包初始化的init函数,而不使用包内部的数据,使用匿名引用格式

  • 匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中。

  • 使用标准格式引用包,但是代码中却没有使用包,编译器会报错。如果包中有init初始化函数,则通过import _ "包的路径"这种方式引用包,仅执行包的初始化函数,即使包没有init初始化函数,也不会引发编译器报错。

import _ "fmt"

示例代码:

package main
import (
_ "database/sql"
"fmt"
)
func main() {
fmt.Println("C语言中文网")
}

包加载

包加载过程:

包的加载过程实际就是一个递归的过程:

包初始化特点:

  • 包初始化程序从main函数引用的包开始,逐级查找包的引用,直到找到没有引用其他包的包,最终生成一个包引用的有向无环图。

  • Go编译器会将有向无环图转换为一棵树,然后从树的叶子节点开始逐层向上对包进行初始化。

  • 单个包的初始化过程如上图所示,先初始化常量,然后是全局变量,最后执行包的init函数。

标签:包名,之包,package,fmt,导入,引用,Go,import,2.14
来源: https://www.cnblogs.com/JunkingBoy/p/15944353.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有