Go语言的源码复用机制建立在包机制上
main 包
- main函数所在的包, 必须是main包, 代表程序的入口 (只有一个, 故一个包下只能有一个main() 函数, 编译整个包文件)
- main包中引入其他的包 import "xxx"
package 包 (在main函数里右键 编译执行的是整个包~)
src: 保存项目源码的路径, 所有代码都用包的形式存放
package 是声明包在哪, 不需要与文件夹名一致, 但最好一致
- 一个目录下的所有Go文件的 package xxx, 必须同名
- 同一个包下所有go文件的函数 可以直接调用 (不区分大小写)
- 导包的时候, 除了系统的包, 其余的导包路径是从 src 目录开始
导包:
- 批量导入 import (xxx)
- 相对路径导入包
- 绝对路径导入包
- 若包名重复 可以用别名来调用 or 简便模式 即 import . "包的路径" 这样可以直接调用包下的函数, 不需要通过包名
- 匿名导入包 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 + 鼠标左键 点进源码进一步学习~
}