首页 > 其他分享 >狂神说Go语言—Go常用包

狂神说Go语言—Go常用包

时间:2022-12-29 23:45:24浏览次数:40  
标签:常用 fmt Println str time Go 狂神 main strings

Go语言中的包

包的本质:创建不同的文件夹,来存放程序文件。

Go语言的源码复用建立在包 (package)基础之上。

main包

Go语言的入口main()函数所在的包必须是main包。

main包想要引用别的代码,则需要import 导入!

包名为main的包为应用程序的入口包,其他包不能使用。

package

Src目录是以代码包的形式组织并保存Go源码文件的

每个代码包都和src目录下的文件夹——对应,每个子目录都是一个代码包。

代码包包名和文件目录名,不要求一致。比如文件目录叫hello,但是代码包包名可以声明为"main",但是同一个目录下的源码文件第一行声明的所属包,必须一致!

同一个目录下的所有go文件的第一行添加包定义,以标记该文件归属的包,演示语法:

package 包名

关于包的使用:

  • 一个目录下的统计文件归属一个包,package的声明要一致

  • package声明的包和对应的目录名可以不一致,但习惯上还是写成一致的

  • 同包下的函数不要导入包,可以直接使用

  • main包, main()的数所在的包,其他的包不能使用·导入包的时候,路径要从src下抒写。src

  • 对于包外而言,在导入包的时候可以使用"包名.函数名"的方式使用包内函数。fmt

使用包成员之前先要导入包。导入包的关键字时import

package main
//相对路径导入包
import "./pojo/user"
//包的重命名不仅可以用于解决包名冲突,还可以解决包名过长、避免与变量或常量名称冲突等情况。
import		"crypto/rand"	//默认模式: rand.Function包实现了用于加解密的更安全的随机数生成器。
import 	R 	"crypto/rand"	//包的别名:通过别名访问该包下的函数等
import  .	"crypto/rand"	//简便模式:可以直接调用该包下的函数等
import 	_	 "crypto/rand"//匿名导入:仅让该包执行init初始化函数
func main() {

}

Go语言使用名称首字母大小写来判断一个对象(全局变量、全局常量、类型、结构字段、函数、方法)的访问权限,相对于包而言同样如此,包的成员名称首字母大小写决定了该成员的访问权限。首字母大写,可被包外访问,即为public(公开的);首字母小写,则仅包内成员可以访问,即为internal (内部的)

Init()函数

Go语言有一个特殊的函数init,先于main函数执行,实现包级别的—些初始化操作。
init函数会在main函数执行之前进行执行、init用在设置包、初始化交量或者其他要在程序运行前优先完成的引导工作.

即使包被导入多次,初始化只需要—次。

init函数通常被用来

  • 对变量进行初始化
  • 检查/修复程序的状态
  • 注册
  • 运行一次计算

每个源文件中可以包含多个init函数

init不能被引用

image-20221229153557194

package main

import (
   _ "awesomeProject/lesson09/test" //匿名导入
   "fmt"
)

// 1、先执行匿名函数的init方法,再执行main
func main() {
   fmt.Println("main-----")
   //init() 不能被调用
}

// 2、先执行匿名函数导入,在执行当前函数下的方法,最后main
// init函数不需要传入参数,也不会返回任何职。与main相比而言,init没有被声明,因此也不能被引用
func init() {
   fmt.Println("main-->init")
}

//3、再次创建test2包->b 在test->a中导入匿名函数  之后执行结果 顺序:
/*
test2->b->init
test->a->init
main-->init
main-----
*/

init执行顺序

为了使用导入的包,首先必须将其初始化。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。这通过Golang的运行时系统控制,如下图所示:

  • 初始化导入的包(递归导入)
  • 对包块中声明的变量进行计算和分配初始值
  • 执行包中的init函数

image-20221229153219027

包:strings

字符串常用操作

package main

import (
   "fmt"
   "strings"
)

func main() {
   //定义一个字符串
   str := "xuexiangban,kuangshenshuo"

   // Contains是否包含指定的内容,返回布尔值
   fmt.Println(strings.Contains(str, "k"))  //在str中是否包含k这个字符
   fmt.Println(strings.Contains(str, "ka")) //精确匹配,ka

   // ContainsAny 是否包含指定的任意一个内容,有一个即可返回布尔值
   fmt.Println(strings.ContainsAny(str, "kz")) //有k或者z字符都为true

   // Count 统计指定内容在字符串中出现的次数
   fmt.Println(strings.Count(str, "z")) //0次
   fmt.Println(strings.Count(str, "k")) //1次
   fmt.Println(strings.Count(str, "x")) //2次

   // HasPrefix 以xx开头
   file := "2022.12.29.mp4"
   fmt.Println(strings.HasPrefix(file, "2022"))
   // HasSuffix 以xx结尾
   fmt.Println(strings.HasSuffix(file, ".mp4"))

   // Index 寻找指定字符串第一次出现的位置,找到返回下标,找不到返回 -1
   fmt.Println(strings.Index(str, "k")) //k在13  因为从0开始数
   fmt.Println(strings.Index(str, "z")) //找不到返回-1

   //IndexAny 寻找指定字符串任意字符第一次出现的位置,找到返回下标,找不到返回-1
   fmt.Println(strings.IndexAny(str, "x")) //第一个x 为0
   fmt.Println(strings.IndexAny(str, "n")) //第7个字母第一次出现n ,为6

   //LastIndex 寻找指定字符串最后一次出现的位置,找到返回下标,找不到返回-1
   fmt.Println(strings.LastIndex(str, "x")) //3
   fmt.Println(strings.LastIndex(str, "n")) //20

   // Join 用指定符号进行字符串拼接
   str2 := []string{"a", "b", "c", "d"}
   fmt.Println(strings.Join(str2, "-"))

   // Split 按照指定符号分割字符
 
   str3 := "a-b-c"
   str4 := strings.Split(str3, "-") //要用切片接收
   fmt.Println(str4)

   //Repeat重复拼接自己
   str5 := "a"
   fmt.Println(strings.Repeat(str5, 3)) //重复拼接3次

   // Replace 替换指定字符,n代表替换个数,-1替换全部l
   fmt.Println(strings.Replace(str, "x", "*", 1))  //替换str中x字符为*,替换个数为1
   fmt.Println(strings.Replace(str, "n", "*", -1)) //替换全部的n字符

   //ToUpper 字母转大写  ToLower 字母转小写
   fmt.Println(strings.ToUpper(str))
   fmt.Println(strings.ToLower(str))

   //截取字符串 str[start:end]
   fmt.Println(str[0:3]) //截取0-3个字符
}
/*
true
false
true
0
1
2
true
true
12
-1
0
6
3
20
a-b-c-d
[a b c]
aaa
*uexiangban,kuangshenshuo
xuexia*gba*,kua*gshe*shuo
XUEXIANGBAN,KUANGSHENSHUO
xuexiangban,kuangshenshuo
xue
*/

包:strconv

string convert

字符串和基本类型之间的转换

package main

import (
   "fmt"
   "strconv"
)

func main() {
   s1 := "true"
   b1, _ := strconv.ParseBool(s1) //返回一个bool和erro  将erro类型丢弃
   fmt.Printf("b1类型为:%T\n", b1)
   fmt.Println(b1)
   if b1 { //b1已经转换为bool类型了
      fmt.Println(s1)
   }
   //int类型转换
   s2 := "100"
   i1, _ := strconv.ParseInt(s2, 10, 64) //ParseInt:传入的字符串,要转换的进制,int类型的大小
   fmt.Printf("i1类型为:%T\n", i1)
   fmt.Println(i1)
   s3 := strconv.FormatInt(100, 2) //FormatInt: 转换的数字,转换的进制
   fmt.Printf("s3类型为:%T\n", s3)
   fmt.Println(s3)

   //itoa int类型转换为字符串类型
   s4 := strconv.Itoa(10)
   fmt.Printf("s4类型为:%T\n", s4)
   fmt.Println(s4 + "abc")
   
   // atoi 字符串转换为int类型
   i2, _ := strconv.Atoi("20")
   fmt.Printf("i2类型为:%T\n", i2)
   fmt.Println(i2 + 10)
}
/*
b1类型为:bool
true
true
i1类型为:int64
100
s3类型为:string
1100100
s4类型为:string
10abc
i2类型为:int
30
*/

时间与时间戳

time包

时间和日期是我们编程中经常会用到的,本文主要介绍了Go语言内置的time包的基本用法

time包提供了时间的显示和测量用的函数

获取当前时间

func time1() {
   t1 := time.Now() //获取当前的时间
   fmt.Println(t1)

   year := t1.Year()
   month := t1.Month()
   day := t1.Day()
   fmt.Printf("%d-%02d-%02d\n", year, month, day) //%02d不足两位时,用0补齐
}

时间格式化

//时间格式化
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05"))
fmt.Println(now.Format("2006/01/02 15:04:05"))
fmt.Println(now.Format("2006/01/02 15:04"))

解析字符串格式的时间

//时区
loc, _ := time.LoadLocation("Asia/Shanghai")
timeobj, _ := time.ParseInLocation("2006-01-02 15:04:05", "2023-01-01 12:00:00", loc)
fmt.Println(timeobj)
fmt.Println(timeobj.Year())

时间戳

//时间戳
timestamp := time.Now().Unix()
fmt.Println(timestamp)           //1672325092
time2 := time.Unix(timestamp, 0) //将时间1672325092转换2022/12/29 22:44:52
fmt.Println(time2)
package main

import (
   "fmt"
   "time"
)

func main() {
   //时间戳
   timestamp := time.Now().Unix()
   fmt.Println(timestamp)           //1672325092
   time2 := time.Unix(timestamp, 0) //将时间1672325092转换2022/12/29 22:44:52
   fmt.Println(time2)

   time1()
   //时间格式化
   now := time.Now()
   fmt.Println(now.Format("2006-01-02 15:04:05"))
   fmt.Println(now.Format("2006/01/02 15:04:05"))
   fmt.Println(now.Format("2006/01/02 15:04"))

   //时区
   loc, _ := time.LoadLocation("Asia/Shanghai")
   timeobj, _ := time.ParseInLocation("2006-01-02 15:04:05", "2023-01-01 12:00:00", loc)
   fmt.Println(timeobj)
   fmt.Println(timeobj.Year())

}
func time1() {
   t1 := time.Now() //获取当前的时间
   fmt.Println(t1)

   year := t1.Year()
   month := t1.Month()
   day := t1.Day()
   fmt.Printf("%d-%02d-%02d\n", year, month, day) //%02d不足两位时,用0补齐
}
/*
1672325092
2022-12-29 22:44:52 +0800 CST
2022-12-29 22:44:52.7879446 +0800 CST m=+0.038077101
2022-12-29
2022-12-29 22:44:52
2022/12/29 22:44:52
2022/12/29 22:44
2023-01-01 12:00:00 +0800 CST
2023
*/

随机数生成

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func main() {
   //rand.Seed(5)  //Seed;种子 ,种子不一样,生成的随机数也就不同
   //i1 := rand.Int() //如果设置的数字没有改变,那么产生的随机数也不会改变
   //fmt.Println(i1)
   //i2 := rand.Intn(20) //Intn [0-19)随机产生
   //fmt.Println(i2)
   
   rand.Seed(time.Now().Unix()) //时间是不停的变化的,所以,这里生成的种子也不停变换,也就能生成随机数
   for i := 0; i < 10; i++ {
      //20-29
      num := rand.Intn(10) + 20
      fmt.Println("num=", num)
   }
}

定时器与时间判断

时间间隔常量Duration

utime.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间以纳秒为单位,可表示的最长时间段大约290年。
utime包中定义的时间间隔类型的常量如下:

const (
Nanosecond Duration = 1
Microsecond		= 1000 * Nanosecond
Millisecond		= 1000 * Microsecond
Second			= 1000 * Mi77isecond
Minute			= 60   * Second
Hour			= 60   * Minute
)

time.Duration表示1纳秒 time.second表示1秒

定时器

//  Tick 心脏心跳
//tick := time.Tick(time.Second)
//for t := range tick {// 每隔一秒执行一次时间
// fmt.Println(t)
//}

for i := 0; i < 10; i++ {
   fmt.Println(time.Now())
   time.Sleep(time.Second) //让程序停一秒
}

Sub:求两个时间之间的差值

Equal:判断两个时间是否相同,这种方法还会比较地点和时区信息,因此不同时区标准的时间也可以正确比较。

Before:如果t代表的时间点在u之前,返回真;否则返回假。

After:如果t代表的时间点在u之后,返回真;否则返回假。

package main

import (
   "fmt"
   "time"
)

func main() {
   now := time.Now()           //现在时间
   later := now.Add(time.Hour) //添加一小时后的时间
   fmt.Println(now)
   fmt.Println(later)

   subtime := later.Sub(now) //later时间与现在相差时间为1h0m0s
   fmt.Println(subtime)

   fmt.Println(now.Equal(now))    //判断时间是否相同
   fmt.Println(now.After(later))  //现在的时间是否在later后面false
   fmt.Println(now.Before(later)) //是否在前面true

}

标签:常用,fmt,Println,str,time,Go,狂神,main,strings
From: https://www.cnblogs.com/DuPengBG/p/17013815.html

相关文章

  • 常用设计模式之简单工厂模式
    简单工厂模式(C++)工厂模式的使用场景也比较多,像是一些组件对象的创建场景,这里说一下简单工厂模式。特点及应用1.特点(1)封装具体实现,只提供管理对象接口举个例子:我......
  • Anaconda之conda常用命令介绍
    anaconda用法:查看已经安装的包: piplist或者condalist 安装和更新:pipinstallrequestspipinstallrequests--upgrade或者:condainstallrequ......
  • GO语言泛型
    有一个遍历数组的方法,要求数组的类型既可以是int型也可以是float64型。以前面对不同数据类型但是逻辑相同的方法写起来会比较麻烦,有了泛型之后写起来就很容易了//T就是泛......
  • MongoDB从入门到实战之Docker快速安装MongoDB
    前言   在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库,让大家快速的了解了MongoDB的基本概念。这一章开始我们就开始实战篇教程,为了快速把Mong......
  • Springoot - 整合MyBatis
    1.导入JDBC驱动因为我的是Mysql数据库版本是8.0.20导入对应版本的驱动即可<!--mysql依赖--><dependency><groupId>mysql</groupId>......
  • Kubernetes(k8s) kubectl auth常用命令
    kubectl在$HOME/.kube目录中查找一个名为config的配置文件。可以通过设置KUBECONFIG环境变量或设置--kubeconfig参数来指定其它kubeconfig文件。本文主要介绍K......
  • go语言的控制反转 (IOC)在工程中应用
    背景最近在总结现有框架中一些比较有亮点的地方,个人觉得带着问题去学习是比较高效的事情,所以把一些学习总结记录下来。IoC是一种设计原理,比较常见于面向对象的设计中反转......
  • docker安装mongodb
    dockerrun-d\--namemongodb\--restartalways\--privileged\-p27017:27017\-v/data/mongodb/data:/data/db\-eMONGO_INITDB_ROOT_USERNAME......
  • Go-21 Golang接口详解
    packagemainimport"fmt"//Golang中的接口详解/* 1.接口的介绍 2.Golang接口的定义 3.空接口 4.类型断言 5.结构体值接收者和指针接收者实现接口的区别 6.一......
  • go语言知识点
    1.可以定义变量而不初始化,则变量默认零值(0/false/""),如vara;intfmt.Println(a)2.可以不指定变量类型,则系统根据变量的初始值判断变量类型。如vara=true3.变量作......