Go 包的介绍和使用

36 阅读3分钟

Go语言的源码复用机制建立在包机制上

main 包

  1. main函数所在的包, 必须是main包, 代表程序的入口 (只有一个, 故一个包下只能有一个main() 函数, 编译整个包文件)
  2. main包中引入其他的包 import "xxx"

package 包 (在main函数里右键 编译执行的是整个包~)

src: 保存项目源码的路径, 所有代码都用包的形式存放

package 是声明包在哪, 不需要与文件夹名一致, 但最好一致

  1. 一个目录下的所有Go文件的 package xxx, 必须同名
  2. 同一个包下所有go文件的函数 可以直接调用 (不区分大小写)
  3. 导包的时候, 除了系统的包, 其余的导包路径是从 src 目录开始

导包:

  1. 批量导入 import (xxx)
  2. 相对路径导入包
  3. 绝对路径导入包
  4. 若包名重复 可以用别名来调用 or 简便模式 即 import . "包的路径" 这样可以直接调用包下的函数, 不需要通过包名
  5. 匿名导入包 import _ "包的路径(从src 开始的路径)" 这样导入会执行导入包下的所有go文件的init函数~
    所有go文件的init函数执行完毕, 参会到import 当前 .go 文件的 main方法中

单文件go是顺序执行 若一个包下有多个go 也是按顺序来执行的(按文件排序顺序来执行)

init 函数

init函数常用于初始化一些全局变量, 建立一些第三方链接(数据库链接, 注册...), 在main方法执行之前执行

init函数可以有多个

匿名导入(只有这样才会执行这个包下的init方法) 则会根据文件夹里文件的顺序来执行多个 .go 文件 然后 .go 文件里的init函数的执行也是从上到下依次执行的

大概的执行流程:

常用的功能包

Strings 包

以下 .go 文件示范了 strings的常见用法

package stringsdemo

import (
	"fmt"
	"strings"
)

func Test() { // 方法首字母是大写 才能被其他文件使用
	str := "hello world"
	fmt.Println(len(str), " ", str[0])
	// strings 的常用方法
	// 1.判断某个字符是否包含指定的内容 .Contains(s, substr string) bool
	s := "llo"
	contains := strings.Contains(str, s)
	fmt.Println(contains) // true 包含~
	// 2.判断某个字符串是否包含了多个字符串的某一个 (只要str出现了第二个参数chars中的字符(一个or多个)就返回true)
	fmt.Println(strings.ContainsAny(str, "eabllo"))
	// 3.统计指定字符串在目标字符串中出现的次数
	fmt.Println(strings.Count(str, "l")) // 3
	// 4. 判断字符串是否以xxx开头 or 结尾
	fileName := "123.mp4"
	if strings.HasSuffix(fileName, ".mp4") {
		// 方法实现细节: return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
		fmt.Println("yes, 文件结尾是.mp4!")
	}
	if strings.HasPrefix(fileName, "12") {
		// 方法实现细节: return len(s) >= len(prefix) && s[0:len(prefix)] == prefix
		fmt.Println("文件是以12开头的!")
	}
	// 5. 寻找某个字符串第一次出现的位置 .Index() 找到就返回在字符串的下标 找不到就返回 -1
	fmt.Println(strings.Index(str, "l")) // l字符第一次出现在 str(line 9) index = 2的位置上
	// 6. 寻找某个字符串第一次出现的位置(模糊搜索) .IndexAny()
	fmt.Println(strings.IndexAny(str, "ol")) // 匹配了chars(第二个参数)中其中一个, 若有多个匹配,则会优先返回index小的
	// 7. 寻找某个字符串最后一次出现的位置 .LastIndex() 匹配不到就返回-1
	fmt.Println(strings.LastIndex(str, "l")) // l字符最后一次出现在 str(line 9) index = 9的位置上
	// 8. 拼接字符串 .Join(待拼接的字符数组, 连接符)
	str1 := []string{"a", "1", "?", "$"}
	fmt.Println(strings.Join(str1, "=")) // 以 = 为连接符(第二个参数) 打印结果: a=1=?=$
	// 9. 拆分字符串 .Split(待拆分的字符数组, 分隔符)
	str2 := "a=1=?=$"
	fmt.Println(strings.Split(str2, "=")) // 返回的是一个字符数组 []string [a 1 ? $]
	// 还有许多方法 这里就不去尝试了, 比如: 大小写 .Toupper()/.Tolower()、替换字符串 .Replace()、截取字符串 .Substr(s,substr) ...
	// 详情可以 通过 Ctrl + 鼠标左键 点进源码进一步学习~
}