Go 语言入门很简单 -- 17. Go Package #私藏项目实操分享#

简介: Go 语言入门很简单 -- 17. Go Package #私藏项目实操分享#

什么是包

image.png

Go 支持良好的软件工程实践。

高质量软件的一个重要组成就是代码重用,体现了软件工程中不要重复“Don't Repeat Yourself”的原则。

函数其实就是代码复用的第一个方法。Go 也提供了另一种支持代码复用的机制:包 package可以把相关关的 Go 源代码组织到同一单元中,使他们模组化、可重复使用和可维护。。

每一个 Go 文件都隶属于某个包,如下图所示:

package <packagename>

截至目前,我们几乎所有的文章中的程序都包括如下的一行:

import "fmt"

fmt 是一个包的名字,包括各种与 格式化屏幕输出 相关的函数。 fmt  是一个核心函式库,包含格式化和打印输出或从各种 I/O 中读取输入等相关的功能。它包括 Println()Printf()Scan() 等函数,以供其他 package 重复使用。

包组织的优点

通过包来组织代码有 3 个目的:

  1. 减少出现重复命名的冲突,保证函数名称保持简短和简洁。
  2. 帮助组织不同代码,以便你更容易找到想重用的代码。
  3. 通过简单的限制重编译程序的一小部分,加快编译的速度。尽管我们使用 fmt 包,但是当我们改变我们的程序时,无需每次都重新编译。

创建一个包

使用GOPATH的工程结构

在 GOPATH 指定的工作目录下,代码总是会保存在 $GOPATH/src 目录下。在工程经过 go buildgo installgo get 等指令后,会将产生的二进制可执行文件放在 $GOPATH/bin 目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg 下。

如果需要将整个源码添加到版本管理工具(Version Control System,VCS)中时,只需要添加 $GOPATH/src 目录的源码即可。bin 和 pkg 目录的内容都可以由 src 目录生成。

包只有在使用它们的独立程序的背景下才真正有意义。没有这个独立的程序,我们就没有办法使用我们创建的包。

让我们创建一个应用程序,它将使用我们将要编写的包。在我们的本地 GOAPTH 中创建一个 包,如C:\Program Files\Go\src\learninggo 中创建一个名为  sort 的文件夹。在该文件夹中创建一个文件叫做 sort.go,其中包含以下内容,我们可以把我们学过的排序算法的代码单独创建一个自己的排序包,这里值简单以冒泡排序为例:

没有看过这篇文章的推荐看看: 跟着动画学Go数据结构之冒泡排序 #私藏项目实操分享#

package sort
func BubbleSortImproved(nums []int, length int) {
    swapped := true
    for i := 0; i < length-1; i++ {
        for j := 0; j < length-i-1; j++ {
            if nums[j] > nums[j+1] { // 如果大,交换
                var temp = nums[j] // 临时变量保存前一个值
                nums[j] = nums[j+1]
                nums[j+1] = temp
                swapped = false
            }
        }
        if swapped {
            break
        }
    }
}

使用终端进入 sort 文件夹,我们能看到刚才创建的 sort.go 文件,使用 go install 命令,然后我们的包就被编译器创建一个链接对象文件到这个路径:

C:\Program Files\Go\pkg\windows_amd64\learninggo\sort.a

C:\Program Files\Go\src\learninggo\sort
λ go install

所以当执行 go install app  命令时,系统就会在 GOPATH 中寻找 src 目录里的 app 子目录。当编译这个包的时候,就会在 bin 目录下创建名为 app 的二进制文件。由于 bin 目录是在 PATH 中的,所以可以通过终端执行其中的文件。

执行 go install <package> 命令后,系统会尝试在指定的包目录里寻找带有 main  包声明的文件。找到之后,Go 就知道这是可执行的程序,需要被编译为二进制文件。一个包里可以有很多文件,但是只能其中一个文件里有 main 函数,标志着这个文件是程序的入口文件。

然后回到我们本地工作的文件夹 Pakcakes ,创建一个 main.go ,在程序中导入我们自己创建的包:

package main
import "fmt"
import "learninggo/sort"
func main() {
    arrays := []int{8, 5, 4, 2, 7, 6, 1, 3}
    length := len(arrays)
    sort.BubbleSortImproved(arrays, length)
    for i := 0; i < len(arrays); i++ {
        fmt.Println(arrays[i])
    }
}

运行代码,结果如下:

[Running] go run "e:\Coding Workspaces\LearningGoTheEasiestWay\Packages\main.go"
1
2
3
4
5
6
7
8

安装第三方包

go get -u github.com/xxx

上面这个命令的意思是,从 http://github.com/xxx  URL 中引用文件,并保存到 src/github.com/xxx  目录中。根据嵌套包的原则,可以像下面这样引用 xxx 包。

总结

你可能已经注意到,我们所看到的软件包中的每个函数都以大写字母开头。在  Go 中,如果某个东西以大写字母开头,就意味着其他包(和程序)能够看到它。如果我们把函数命名为 bubbleSortImproved 而不是  BubbleSortImproved,我们的主程序就无法看到它了。

这是一个很好的做法,只公开我们的软件包中我们希望其他软件包使用的部分,而隐藏其他的部分。这使我们能够自由地改变这些部分,而不需要别人担心会破坏其他程序,而且它让我们的包更容易使用。

包的名称应该与它们所在的文件夹相匹配。有一些方法可以解决这个问题,但如果你遵循这个规则,会容易得多。

相关文章
|
4月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
520 43
Go语言深度解析:从入门到精通的完整指南
|
4月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
294 1
|
5月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
6月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
481 0
|
6月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
322 0
|
12月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
12月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
6月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
415 1
|
6月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
354 0

热门文章

最新文章