Go常用包

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

Go语言的源码复用建立再包package基础之上

main包

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

main包需要引用代码,则需要通过import导入

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

package

Src目录是以代码包的形式组织并保存Go源码问价的,每个代码包都和src目录下的文件夹一一对应,每个子目录都是一个代码包。代码包包名和文件目录名,不要求一致,但是同属一个目录下的源码文件的包名必须一致

包的导入

1、相对路径导入包

import "./pkg"

2、默认模式导入

import "crypto/rand"

import R "crypto/rand" 将此包重命名 使用 可以直接通过R.rand()

import . "crypto/rand" 简便模式 可以以直接调用此包下的函数等 不建议使用

import _ "crypto/rand" 匿名导入,仅让该包执行init初始化函数

init()函数

init()先于main函数执行,init应用在设置包、初始化变量或者其它要在程序运行前优先完成的引导工作。即使包被导入多次,初始化只需要一次

init函数通常用来:

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

init函数不需要传入参数,也不会返回任何值,init没有被声明,也不能被引用

init函数不需要传入参数,也不会返回任何值,init没有被声明,也不能被引用

init函数不需要传入参数,也不会返回任何值,init没有被声明,也不能被引用

init执行顺序

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

  • 初始化导入的包(递归导入)

  • 对包块中声明的变量进行计算和分配初始值

  • 执行包中的init函数

PS:有一种情况:一个被导入包下有多个go文件中都含有init方法 顺序是什么样呢? 按照go文件名的首字母先后顺序排列

strings包

func main() {
str := "我爱你中国,我爱你中国" fmt.Println(str) //Contains 是否包含指定的内容,返回布尔值
fmt.Println(strings.Contains(str, "爱"))
fmt.Println(strings.Contains(str, "不爱")) //ContainAny 是否包含指定的内容中任意一个 有一个即可
fmt.Println(strings.ContainsAny(str, "不爱")) //Count 统计指定内容再字符串中出现的次数
fmt.Println(strings.Count(str, "爱")) //HasPrefix 以xx开头
filename := "20221116.mp4"
if strings.HasPrefix(filename, "2022") {
fmt.Println(filename)
}
//HasSuffix 以xx结尾
if strings.HasSuffix(filename, "mp4") {
fmt.Println(filename)
} //Index 寻找指定字符串第一次出现的位置,返回下标 没有找到则返回-1
fmt.Println(strings.Index(str, "没有")) //IndexAny 寻找指定字符串任意一个字符第一次出现的位置,返回下标 没有找到则返回-1
fmt.Println(strings.IndexAny(str, "爱他")) //LastIndex 寻找指定字符串最后一次出现的位置,没有返回-1
fmt.Println(strings.LastIndex(str, "中")) //join用来指定符号来拼接字符串
str2 := []string{"a", "b", "cd", "e"}
str3 := strings.Join(str2, "")
fmt.Println(str3) //split按照指定符号分割字符
str4 := strings.Split(str3, "") //指定的字符没有找到就返回原字符串
fmt.Println(str4) //Repeat 重复拼接自己
str5 := strings.Repeat(str, 2)
fmt.Println(str5) //Replace 替换指定字符,n代表替换个数,-1替换全部
str6 := strings.Replace(str, "爱", "恨", 12)
fmt.Println(str6) //ToUpper 字母转大写 ToLower 字母转小写
str7 := "sdfAjkkajsd"
fmt.Println(strings.ToUpper(str7))
fmt.Println(strings.ToLower(str7)) //截取字符串 str[start,end]
str8 := str7[:3]
fmt.Println(str8)
}

strconv包

可是实现字符串和基本类型的转换

strconv.Parsexxx是将字符串转换为相对于的基本类型

strconv.Formatxxx是将对应的基本类型转换为字符串

func main() {
s1 := "true" //将字符串转换为bool类型
b1, err := strconv.ParseBool(s1) //记得看一个源码 返回什么类型
if err != nil {
fmt.Println(err)
}
fmt.Printf("%T\n", b1) //bool
fmt.Println(b1) //将bool类型转换为字符串
s2 := strconv.FormatBool(b1)
fmt.Printf("%T\n", s2)
fmt.Println(s2) //将字符串转换为整型 int 有二进制,八进制 十进制等
s3 := "100"
n1, _ := strconv.ParseInt(s3, 10, 64) //目标字符串 进制 数字大小限制
fmt.Printf("%T\n", n1)
fmt.Println(n1) //整型转换为字符串
s4 := strconv.FormatInt(100, 2) //目标数值 进制
fmt.Printf("%T\n", s4)
fmt.Println(s4) //一般情况下字符串与int 10进制转换可以采用atoi itoa实现快速转换
n2, _ := strconv.Atoi("-10")
fmt.Printf("%T\n", n2)
fmt.Println(n2 + 10) s5 := strconv.Itoa(10)
fmt.Printf("%T\n", s5)
fmt.Println(s5) }

时间与时间戳

获取日期 时间

func time1() {

   //获取当前时间
now := time.Now()
fmt.Println(now) //获取当前年份
year := now.Year()
//获取当前月份
month := now.Month()
//获取当前日
day := now.Day()
//获取当前时
hour := now.Hour()
//获取当前分
min := now.Minute()
//获取当前秒
sec := now.Second() //02是输出的整型数值 不足两位用0补齐
fmt.Printf("%d-%02d-%02d %d:%d:%d", year, month, day, hour, min, sec)
}

日期格式化

func main() {
//time1() var now time.Time
now = time.Now() //go语言日期格式化与其他语言有所不同 不是使用YYYYMMDD HH:MM:SS
//而是 使用go语言的诞生日期作为格式 20060102 15:04
fmt.Println(now.Format("2006/01/02")) //只输出年月日
fmt.Println(now.Format("2006/01/02 15:04:05")) //24h日期输出
fmt.Println(now.Format("2006/01/02 03:04:05 PM")) //12h日期输出 最后加上PM也可 不加也可
//20060102 15:04 怎么变化那么输出的日期也会与只格式一致
}

解析字符串的时间

//将字符串拼凑成time格式 使之可以被获取年月日  时区等
local, _ := time.LoadLocation("Asia/Shanghai") //地区需要确实存在
time2, _ := time.ParseInLocation("2006/01/02 15:04:05", "2023/01/01 12:12:12", local)
fmt.Println(time2)

时间戳

所谓时间戳就是从1970年1月1日(08:00:00GMT)到现在的毫秒总数

//时间戳
timestamp := time.Now().Unix()
fmt.Println(timestamp) //因为一直会变化 可以作为一个随机数使用 //将时间戳转换为日期
time1 := time.Unix(timestamp, 0)
time1.Year()
fmt.Println(time1) //2022-11-17 21:11:41 +0800 CST

随机数

调用"math/rand"包 要注意设置种子数,这样每次生成的结果才会不断变化

//设置种子
rand.Seed(5) //不设置种子的话或者种子不变化 下面每次都是同样的数字
num1 := rand.Int()
fmt.Println(num1) //种子不一样生成的随机数才会不一样

使用intn方式 搭配变换种子 生成自定义的随机数

func ran() {
//时间戳每秒都在变化
rand.Seed(time.Now().Unix())
for i := 0; i < 10; i++ {
//n是数字现在 等于10 是每次生成的数不超过10
num := rand.Intn(100)
fmt.Println(num)
}
}

这里注意哦 如果是Intn(10) 循环次数再10以及10以上 怎么都会有相同的数字出现 所以 注意一些

定时器与时间判断

Go_day07的更多相关文章

随机推荐

  1. Visual Studio常用的宏

    $(SolutionDir) 表示获取解决方案文件.sln所在文件夹 $(ProjectDir 获取项目工程文件.vcxproj所在文件夹 $(Configuration) 获取编译后的Debug / ...

  2. axios进行图片上传

    进行图片的上传,一定要注意headers的设置:             headers:{"Content-Type":"multipart/form-data&quo ...

  3. 利用Comparator对枚举类型进行排序的实现

    1. 利用BeanComparator对List<Object>根据属性进行排序 String daXiaoOrder[] = {"很小","小", ...

  4. 063_Apex 的 Test类说明

    @isTest public class TestUtil { public static void createTestAccounts() { // Create some test accoun ...

  5. E. Permutation Game

    https://codeforces.com/contest/1772/problem/E 题目大意就是给一个1~n的全排序列,所有数字都是红色的,两人轮流操作,操作有三种选择,第一是将所有蓝色的数字 ...

  6. 同一系统开启两个ftp进程

    1.正常情况是yum 安装vsftpd服务 ,在/etc/vsftpd目录更改配置,起服务.这样启动是一个服务. 2.启动第二个vsftpd服务 #创建虚拟用户 useradd -d /home/vi ...

  7. 错题记录:C51同一个hex文件偶尔效果不行 的处理方法

    51单片机很多方面和C语言有区别,经验下来,总结以下:1.关于变量报错:报错的原因大多是因为编译器C++版本不同,所以变量我都推荐使用驼峰命名法;2.如果同一个hex文件,或者改的代码自己认为没问题 ...

  8. 替代学习物联网-云服务-01百度云MQTT

     1.登录百度智能云  2.进入 物联网接入 https://console.bce.baidu.com/iot2/core/core/list https://iotcore-dev-tool.gz ...

  9. JDK的安装及卸载

    JDK安装及卸载 卸载JDK 删除JAVA安装目录 删除java_home 删除path下关于Java的目录 java-version 查看是否仍能查看 安装JDK 百度搜索JDK8(性能稳定)找到下 ...

  10. vue后台管理系统——订单管理模块

    电商后台管理系统的功能--订单管理模块 1. 订单管理概述 订单管理模块用于维护商品的订单信息, 可以查看订单的商品信息.物流信息,并且可以根据实际的运营情况对订单做适当的调整. 2. 订单列表 在c ...