defer
在函数中,程序员经常创建资源(比如:数据库得连接,锁等),为了在函数执行完毕后,及时得释放资源,defer 就可以使用了(延时机制)
字符串常用得系统函数
- 统计字符串长度: len(str) ; 返回字符串或者数组的长度
- 字符串遍历,同时处理含有中文得问题: arr:=[]run(str); 将字符串转换成切片
示例:
str:="你好,abc"
for i := 0; i <len(str); i++ {
fmt.Printf("i: %c\n", str[i])
}
打印输出
i: äi: ½i: i: åi: ¥i: ½i: ,i: ai: bi: c
因为含有中文字符,如果不进行转换,则打印输出会乱,不是我们想要的结果
str:="你好,abc"
arr:=[]rune(str)
for i := 0; i <len(arr); i++ {
fmt.Printf("i: %c ", arr[i])
}
打印输出
i: 你 i: 好 i: , i: a i: b i: c
- 字符串转整数: strconv.Atoi(str)
//strconv.Atoi 有2个返回值,一个是转换成功的数值,一个是转换不成功的错误返回
num,err:=strconv.Atoi("123")
if err != nil{
fmt.Printf("err: %v\n", err)
}else{
fmt.Printf("num: %v\n", num)
}
- 整数转字符串: strconv.Itoa(int)
- 字符串转byte: []byte(str)
- byte转字符串:str=string([]byte{97,98,99})
- 进制转换 :str=strconv.FormatInt(int64,int);int64 要转换的数字;int 要转换的进制 2,8,10 转换的结果为对应的字符串
- 判断字符串是否在另一个字符串中:strings.Contains(“hello,world”,“world”) 如果在 则返回true否则false
- 判断字符串在另一个字符串中有几个:strings.Count(“hello,world”,“world”) 返回包含个数
- 不区分大小写进行判断:strings.EqualFold(“hello,world”,“world”) 返回bool类型
- 区分大小写判断使用 abc==Abc == 相当于全等于
- 返回一个字符串在另一个字符串首次出现的下标值: str:=strings.Index(“hello,world”,“world”) 返回int 类型
- 返回一个字符串在另一个字符串最后一次出现的下标值: str:=strings.LastIndex(“hello,world”,“world”) 返回int 类型
- 字符串替换:strings.Replace(str,str2,str3,num)
//第一个参数是需要匹配的字符串
//第二个参数是需要替换字符串
//第三个是要替换的字符串
//第四个是如果有多个要替换的字符串,那么代表要替换的数量 -1为全部替换
num:=strings.Replace("hhhhh,world","h","北京",1)
- 按照指定字符切割字符串为字符串数组:strings.Split(“h,h,h,h,h,world”,“,”)
//根据,分割;返回字符串数组切片
num:=strings.Split("h,h,h,h,h,world",",")
fmt.Printf("type=%T,num=%v\n", num,num)
打印结果
type=[]string,num=[h h h h h world]
- 字符串中字母的大小写转换函数 strings.ToLower(“GO”);转小写。strings.ToUpper(“go”);转大写。
- 字符串左右俩边的空格去掉:strings.TrimSpace(" go ");
- 将字符串左右俩边指定字符去掉:strings.Trim(“!go!”,“!”);
- 将字符串左边指定字符去掉:strings.TrimLeft(“!go!”,“!”);
- 将字符串右边指定字符去掉:strings.TrimRight(“!go!”,“!”);
- 判断字符串是否以指定字符串开头:strings.HasPrefix(“https://go.com”,“https”);返回bool类型
- 判断字符串是否以指定字符串结尾:strings.HasSuffix(“GO.jpg”,“jpg”);返回bool类型
- 后续补充…jpg
- go文档地址:https://studygolang.com/pkgdoc
时间和日期相关函数
- 初始化时间 now()
// Now返回当前本地时间
now:=time.Now()
fmt.Printf("now: %v\n", now)
- 年
now:=time.Now()
fmt.Printf("年: %v\n", now.Year())
- 月
now:=time.Now()
fmt.Printf("月: %v\n", now.Month())//英文月
fmt.Printf("月: %v\n", int(now.Month()))//数字月
- 日
now:=time.Now()
fmt.Printf("日: %v\n", now.Day())
- 时
now:=time.Now()
fmt.Printf("时: %v\n", now.Hour())
- 分
now:=time.Now()
fmt.Printf("分: %v\n", now.Minute())
- 秒
now:=time.Now()
fmt.Printf("秒: %v\n", now.Second())
- 格式化时间
// Now返回当前本地时间
now:=time.Now()
//返回当前时间格式为年月日时分秒【2006/01/02 15:04:05为固定值;不可变】
//由来2006为Golang诞生时间,15是下午3点。
//帮助记忆的方法:1月2日3点4分5秒,2006年,-7时区,正好是1234567。
//2006/01/02 15/04/05 可以自由组合返回时间
date:=now.Format("2006-01-02 15:04:05")
fmt.Printf("date: %v\n", date)
- 时间单位
Nanosecond Duration = 1 //1纳秒
Microsecond = 1000 * Nanosecond //1微妙=1000*纳秒
Millisecond = 1000 * Microsecond //1毫秒=1000*1微妙
Second = 1000 * Millisecond //1秒=1000*1毫秒
Minute = 60 * Second //1分钟=60*1秒
Hour = 60 * Minute //1小时=60*1分钟
- 获取时间戳
// Now返回当前本地时间
now:=time.Now()
unix:=now.Unix()
unixnano:=now.UnixNano()
fmt.Printf("unix: %v\n", unix)
fmt.Printf("unixnano: %v\n", unixnano)
//打印结果
// unix: 1658126367
//unixnano: 1658126367931653600
错误处理
- defer,panic,recover 可以使用defer+recover来处理异常
//定义一个匿名函数
defer func () {
//recover()函数可以捕捉到异常
err:=recover()
//如果捕捉到了异常就输出异常信息
if err !=nil{
fmt.Printf("err: %v\n", err)
}
}()
- panic输出错误并终止程序
panic("终止程序,并输出错误")
- 自定义错误
package main
import (
"errors"//引用包
"fmt"
)
func main(){
err:= errors.New("我是自定义错误")
fmt.Printf("err: %v\n", err)
}
随机字符串函数得使用注意事项
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
//官方示例;我理解为要是需要生成不同得随机数,需要给一个纳秒得随机时间;也就是说的种子,不然可能会出现相同得随机数
//每次播撒相同的值都会产生相同的随机序列。
//对于不同的数字,种子使用不同的值,例如
// time.Now().unixnano(),它产生一个不断变化的数字。
rand.Seed(time.Now().UnixNano())
answers := []string{
"这是肯定的",
"确实如此",
"毫无疑问",
"肯定是的",
"你可以相信它",
"在我看来是的",
"最有可能",
"前景好",
"是的",
"迹象表明是",
"回复朦胧再试一次",
"以后再问",
"最好现在不告诉你",
"目前无法预测",
"集中注意力再问",
"别指望了",
"我的回答是不",
"我的消息来源说没有",
"前景不太好",
"非常怀疑",
}
fmt.Println("魔法球说:", answers[rand.Intn(len(answers))])
}