go语言的包使用,以及错误处理
一.包
1.包的分类:系统内置、自定义、第三方
2.自定义包:外部引用包里面的内容(如变量、常量、类型、函数等),包里面内容的首字母大写
格式:
import (
_"day04/calc" //匿名导入,果只希望导入包,而不使用包内部的数据时,可以使用匿名导入包
aka "day04/calc" //起别名
"day04/calc"
"fmt"
)
(1)整个目录通过go mod init name ,初始化项目
(2)在方法里面定义父目录的报名a.go-->package demo01
(3)其他里面导入使用"day08/demo01" --->demo01.Sum(10, 20),包名.方法名
3.第三方包下载:go get + 仓库地址@版本号 //下载包
go get -u + 仓库地址@版本号 //更新包
go install //Go 1.17版本后下载包
go mod tidy //清理包,会自动安装依赖包,不需要的包清理掉
4.go.sum文件:在向模块添加第三方依赖时,Go工具链会生成并管理go.sum文件,文件结构示例
.
|-- go.mod
|-- go.sum
|-- main.go
5.正则表达式:regexp 包
.: 匹配任意单个字符,除了换行符。
^: 匹配字符串的开头。
$: 匹配字符串的结尾。
*: 匹配前面的子表达式零次或多次。
+: 匹配前面的子表达式一次或多次。
?: 匹配前面的子表达式零次或一次。
{}: 指定前面的子表达式出现的次数。
[]: 字符集合中的任意一个字符。
|: 匹配左右两个表达式中的任意一个。
(): 分组
(1)正则的使用:编译+匹配
1)先写正则规则进行编译
#re := regexp.MustCompile("\\d+")
re := regexp.MustCompile(`\d+`) // 编译一个正则表达式,匹配一个或者多个数字
2)调用函数匹配
#判断字符串是否匹配正则表达式
re.MatchString(str) // 输出 true
#查找第一个匹配的字符串
re.FindString(str) //查找第一个匹配的字符串,输出 123
#查找所有匹配的子串
re.FindAllString(str, -1) // 输出 [123 456 789]
#替换所有匹配的子串
re.ReplaceAllString(str, "***") //输出替换后的完整版字符串
6.错误处理
(1)error 接口,返回错误描述信息
// 1.自定义错误类型
type MyError struct {
msg string
}
(2)panic:捕获错误,中止程序
(3) recover: 与 defer 一起使用,捕获panic错误,让panic程序不中止,
package main
import "fmt"
func thirdPartyLibrary() {
// 模拟第三方库内部触发 panic
panic("第三方库内部出现错误")
}
func safeCall() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到第三方库的 panic:", r)
}
}()
thirdPartyLibrary()
}
func main() {
safeCall()
fmt.Println("程序继续执行...")
}
一.包
1.包的分类:系统内置、自定义、第三方
2.自定义包:外部引用包里面的内容(如变量、常量、类型、函数等),包里面内容的首字母大写
格式:
import (
_"day04/calc" //匿名导入,果只希望导入包,而不使用包内部的数据时,可以使用匿名导入包
aka "day04/calc" //起别名
"day04/calc"
"fmt"
)
(1)整个目录通过go mod init name ,初始化项目
(2)在方法里面定义父目录的报名a.go-->package demo01
(3)其他里面导入使用"day08/demo01" --->demo01.Sum(10, 20),包名.方法名
3.第三方包下载:go get + 仓库地址@版本号 //下载包
go get -u + 仓库地址@版本号 //更新包
go install //Go 1.17版本后下载包
go mod tidy //清理包,会自动安装依赖包,不需要的包清理掉
4.go.sum文件:在向模块添加第三方依赖时,Go工具链会生成并管理go.sum文件,文件结构示例
.
|-- go.mod
|-- go.sum
|-- main.go
5.正则表达式:regexp 包
.: 匹配任意单个字符,除了换行符。
^: 匹配字符串的开头。
$: 匹配字符串的结尾。
*: 匹配前面的子表达式零次或多次。
+: 匹配前面的子表达式一次或多次。
?: 匹配前面的子表达式零次或一次。
{}: 指定前面的子表达式出现的次数。
[]: 字符集合中的任意一个字符。
|: 匹配左右两个表达式中的任意一个。
(): 分组
(1)正则的使用:编译+匹配
1)先写正则规则进行编译
#re := regexp.MustCompile("\\d+")
re := regexp.MustCompile(`\d+`) // 编译一个正则表达式,匹配一个或者多个数字
2)调用函数匹配
#判断字符串是否匹配正则表达式
re.MatchString(str) // 输出 true
#查找第一个匹配的字符串
re.FindString(str) //查找第一个匹配的字符串,输出 123
#查找所有匹配的子串
re.FindAllString(str, -1) // 输出 [123 456 789]
#替换所有匹配的子串
re.ReplaceAllString(str, "***") //输出替换后的完整版字符串
6.错误处理
(1)error 接口,返回错误描述信息
// 1.自定义错误类型
type MyError struct {
msg string
}
(2)panic:捕获错误,中止程序
(3) recover: 与 defer 一起使用,捕获panic错误,让panic程序不中止,
package main
import "fmt"
func thirdPartyLibrary() {
// 模拟第三方库内部触发 panic
panic("第三方库内部出现错误")
}
func safeCall() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到第三方库的 panic:", r)
}
}()
thirdPartyLibrary()
}
func main() {
safeCall()
fmt.Println("程序继续执行...")
}