go代码结构化(1)

191 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

1. 包的概念

包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自己的包或者从其它包中导入内容。

其它一些编程语言中的类库或命名空间的概念,每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 .go 为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。

必须在源文件中非注释的第一行指明这个文件属于哪个包,例如package main 。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。package main包下可以有多个文件,但所有文件中只能有一个main()方法,main()方法代表程序入口。

一个应用程序可以包含不同的包,而且即使只使用 main 包也不必把所有的代码都写在一个巨大的文件里:你可以用一些较小的文件,并且在每个文件非注释的第一行都使用 package main 来指明这些文件都属于 main 包。如果你打算编译包名不是为 main 的源文件,如 pack1,编译后产生的对象文件将会是 pack1.a 而不是可执行程序。另外要注意的是,所有的包名都应该使用小写字母。当然,main包是不能在其他文档import的,编译器会报错:

import "xx/xx" is a program, not an importable package

简单地说,在含有mian包的目录下,你可以写多个文件,每个文件非注释的第一行都使用 package main 来指明这些文件都属于这个应用的 main 包,只有一个文件能有mian() 方法,也就是应用程序的入口。main包不是必须的,只有在可执行的应用程序中需要。

2.包的导入

一个 Go 程序是通过 import 关键字将一组包链接在一起。

import “fmt” 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。包名被封闭在半角双引号 “” 中。如果你打算从已编译的包中导入并加载公开声明的方法,不需要插入已编译包的源代码。

import 其实是导入目录,而不是定义的package名字,虽然我们一般都会保持一致,但其实是可以随便定义目录名,只是使用时会很容易混乱,不建议这么做。

例如:package big ,我们import “math/big” ,其实是在src中的src/math目录。在代码中使用big.Int时,big指的才是Go文件中定义的package名字。

当你导入多个包时,最好按照字母顺序排列包名,这样做更加清晰易读。

如果包名不是以 ./ ,如 “fmt” 或者 “container/list”,则 Go 会在全局文件进行查找;如果包名以 ./ 开头,则 Go 会在相对目录中查找。

导入包即等同于包含了这个包的所有的代码对象。

除了符号 _,包中所有代码对象的标识符必须是唯一的,以避免名称冲突。但是相同的标识符可以在不同的包中使用,因为可以使用包名来区分它们。

导入包的路径的几种情况:

  • 第一种方式相对路径
import   "./module"   //当前文件同一目录的module目录, 没什么用容易出错,不建议用
  • 第二种方式绝对路径
import  "LearnGo/init"  //加载Gopath/src/LearnGo/init模块,建议这样使用""

导入多个包的常见的方式是:

import  ("fmt""net/http" )

调用导入的包函数的一般方式:

fmt.Println("Hello World!")

下面展示一些特殊的import方式

  • 点操作 import( . “fmt” ) 这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,如可以省略的写成Println(“hello world!”)
  • 别名操作 别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字。
import(
    f "fmt"
)

别名操作调用包函数时前缀变成了我们的前缀,即f.Println(“hello world”)。在实际项目中有这样使用,但请谨慎使用,不要广泛采用这种形式。

  • _操作 _操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数。
import (
    _ "github.com/revel/modules/testrunner/app"
    _ "guild_website/app"
)
3.标准库

在 Go 的安装文件里包含了一些可以直接使用的包,即标准库。在 Windows 下,标准库的位置在 Go 根目录下的子目录 pkg\windows_386 中;在 Linux 下,标准库在 Go 根目录下的子目录 pkg\linux_amd64 中(如果是安装的是 32 位,则在 linux_386 目录中)。Go 的标准库包含了大量的包(如:fmt 和 os), 在$GoROOT/src中可以看到源码,也可以根据情况自行重新编译。

unsafe: 包含了一些打破 Go 语言“类型安全”的命令,一般的程序中不会被使用,可用在 C/C++ 程序的调用中。

syscall-os-os/exec: os: 提供给我们一个平台无关性的操作系统功能接口,采用类Unix设计, 隐藏了不同操作系统间差异,让不同的文件系统和操作系统对象表现一致。

os/exec: 提供我们运行外部操作系统命令和程序的方式。

syscall: 底层的外部包,提供了操作系统底层调用的基本接口。

archive/tar 和 /zip-compress:压缩(解压缩)文件功能。

fmt-io-bufio-path/filepath-flag:

fmt: 提供了格式化输入输出功能。

io: 提供了基本输入输出功能,大多数是围绕系统功能的封装。

bufio: 缓冲输入输出功能的封装。

path/filepath: 用来操作在当前系统中的目标文件名路径。

flag: 对命令行参数的操作。