19 Golang包以及go mod

learninginto · · 594 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

包的介绍和定义

包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为辅我们提供了很多内置包,如fmt/strconv/strings/sort/errors/time/encoding/json/os/io等。

Golang中的包可以分为三种:1. 系统内置包 2. 自定义包 3. 第三方包

系统内置包:Golang语言给我们提供的内置包,引入后可以直接使用,如fmt/strconv/strings/sort/errors/time/encoding/json/os/io等。

自定义包:开发者自己写的包

第三方包:属于自定义包的一种,需要下载安装到本地后才可以使用,如“github.com/shopspring/decimal”包解决float精度丢失问题

包管理工具go mod
  1. 在项目的当前目录里,执行命令:go mod init 项目名 ,会在当前项目目录下自动创建go.mod文件。
  1. 进入当前项目目录,执行命令:go run main.go,此时会自动下载和关联该项目用到的包。
  • 自定义第三方包

进入到go的项目目录下

go mod int demo
  • 新建自定义包文件夹calc及calc.go文件
package calc
var aaa = "私有变量"
var Age = 20

//首字母大写,代表公有方法
func Add(x, y int) int {
    return x + y
}

func Sub(x, y int) int {
    return x - y
}
  • 在main.go中导入
package main 
import (
    "fmt"
    "demo/calc"
)

func main() {
    sum := calc.Add(10, 2)
    fmt.Println(sum) //12
    sub := calc.Sub(10, 2)
    fmt.Println(sub) //8
}
  • 注意事项
  1. 一个文件夹下面直接包含的文件只能归属一个package,同样一个package的文件不能在多个文件夹下
  2. 包名可以不和文件夹的名字一样,包名不能包含-符号
  3. 包名为main的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含main包的源代码则不会得到可执行文件
  4. 一个包中的方法要求不能重复
导入包的方式
  • 单行导入
import "包1"
import "包2"
  • 多行导入
import (
    "包1"
    "包2"
)
导入时自定义包名

通常用于导入的包名太长或者导入的包名冲突的情况

import 别名 "包的路径"
  • 单行引入定义别名
import c "demo/calc"
  • 多行引入定义别名
import (
    "fmt"
    "demo/calc"
    T "demo/tools"
)

func main() {
    T.PrintInfo();
}

如果只希望导入包,而不使用包内部的数据时,可以使用匿名导入包:在包前面加一个下划线

import _ "demo/calc"

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

init()函数

包中init函数的执行时机: 全局声明 > init() > main()

在运行时,Go编译器构建了一个树状的包引用关系,根据引用顺序决定编译顺序,依次编译这些包的代码,被最后导入的包会最先初始化并调用其init()函数

例:在main中importA, A中importB, B中importC,初始化时执行的顺序为C.init() > B.init() > A.init() > main.init()


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:learninginto

查看原文:19 Golang包以及go mod

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

594 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传