go常用包学习笔记
包可以理解为文件夹,存储代码的地方
一般都存在src目录下
多种导包方式
一:默认方式
二:. “xx/xx” 调用的时候不需要写包名,可以直接调用包下的函数,结构体等。
三:R “xx/xx” 别名方式
四:_ “xx/xx” 只执行包中的init()
init函数
通常用来变量初始化,检查/修复程序的状态,注册,运行一次程序
先行与main函数执行。
如果一个包中有多个init函数,按照文件的顺序执行。
strings包
func main() {
var (
a string
)
a = "hellos,yuanshun"
//Contains判断a中是否包含y
fmt.Println(strings.Contains(a, "y")) //true
fmt.Println(strings.Contains(a, "ya")) //false
//ContainsAny 判断a中是否包含a,b,有一个就返回true
fmt.Println(strings.ContainsAny(a, "ab")) //true
//Count统计l在a中出现了几次
fmt.Println(strings.Count(a, "l")) //2
//hasPrefix判断是不是以hello开头
fmt.Println(strings.HasPrefix(a, "hello")) //true
//hasSuffix判断是不是以shu结尾
fmt.Println(strings.HasSuffix(a, "shu")) //false
//Index判断s第一次出现的位置
fmt.Println(strings.Index(a, "s")) //5
//IndexAny判断y,h第一次出现的位置, 返回的竟然是0
fmt.Println(strings.IndexAny(a, "yh")) //0
//LastIndex,查找h最后一次出现的位置
fmt.Println(strings.LastIndex(a, "h")) //12
//join拼接 (只能是string类型的切片,数组和int类型的都不行)
b := []string{"1", "2", "3", "4", "5"}
b1 := strings.Join(b, "x")
fmt.Println(b1) //1x2x3x4x5
//split将字符串按照指定字符拆分自己,变成切片类型了
b2 := strings.Split(a, ",")
fmt.Println(b2) //[hellos yuanshun]
//Repeat
b3 := strings.Repeat("a", 5)
fmt.Println(b3) //aaaaa
//Replace 4个参数,源端,要改的,改成什么样,改几次,-1代表全部
b4 := strings.Replace(a, "a", "*", -1)
fmt.Println(b4) //hellos,yu*nshun
//ToLower全部变小写
fmt.Println(strings.ToLower(a)) //hellos,yuanshun
//ToUpper全部变大写
fmt.Println(strings.ToUpper(a)) //HELLOS,YUANSHUN
//str截取
b5 := a[0:5]
fmt.Println(b5) //hello
}
strconv包
func main() {
str := "true"
//将字符串true,变成bool类型true,返回两个参数 1也可以
str1, _ := strconv.ParseBool(str)
fmt.Println(str1)
//将bool类型的true,变为字符串true
str2 := strconv.FormatBool(str1)
fmt.Println(str2)
i := "10"
//将字符串2进制的10以64位输出为int类型
i1, _ := strconv.ParseInt(i, 2, 64)
fmt.Println(i1)
//将10进制的数,转为字符串类型
i2 := strconv.FormatInt(i1, 10)
fmt.Println(i2)
//atoi 字符串转数字(返回2个参数)
fmt.Println(strconv.Atoi("20")) //20 nil
//itoa数字转字符串
fmt.Println(strconv.Itoa(30))
}
时间包
将字符串转为时间类型,前后必须格式一致。前后格式需要一样 还搞的要写两个参数,感觉传进去value参数就够了。
func main() {
time1 := time.Now()
//将time1按照自己想要的格式化输出。注意:这个612345是固定的。
fmt.Println(time1.Format("2006/01/02 03:04:05 PM"))
fmt.Println(time1.Format("2006/01/02 15:04:05 "))
time2, _ := time.LoadLocation("Asia/Shanghai") //取上海时区
//前后格式必须一样,不然结果不对,感觉不够人性化
//想把字符串"2022-11-02 05:16:52",变成年月日的时间类型,要分开操作
//先变成时间,在转换格式。
time3, _ := time.ParseInLocation("2006-01-02 15:04:05", "2022-11-02 05:16:52", time2)
fmt.Println(time3)
fmt.Println(time3.Format("2006年01月02日 03:04:05 PM"))
}
时间戳
现在到1970年1月1日 08点的毫秒数
func main() {
//到1970年1月1日8点的毫秒
time1 := time.Now().Unix()
fmt.Printf("%T\n", time1) //int
fmt.Println(time1) //1667382419
//真不知道这个0是干嘛的,写其他数字 也没啥变化
time2 := time.Unix(time1, 0) //2022-11-02 17:59:32 +0800 CST
fmt.Println(time2)
time3 := time.Unix(time1, 9) //2022-11-02 18:00:41.000000009 +0800 CST
fmt.Println(time3)
}
随机数
太low了,要写两个函数,因为rand.int()出来的数字,是根据rand.Seed()的值变化,如果种子一样,那么就永远一样。
func main() {
rand.Seed(time.Now().Unix())
r1 := rand.Int()
//随机数在20-29之间
r2 := rand.Intn(10) + 20
fmt.Println(r1) //1680632613514789431
fmt.Println(r2) //27
}