时间和日期的相关函数
1)时间和日期函数
now :=time.Now() //获取当前时间,可以通过now获取当前时间的年月日,时分秒
fmt.Printf("now=%v \nnow type=%T\n",now,now)
fmt.Printf("年=%v\n",now.Year())
fmt.Printf("月=%v\n",now.Month())
fmt.Printf("月=%v\n",int (now.Month())) //外面加一个int,把输出转换为整型
fmt.Printf("日=%v\n",now.Day())
fmt.Printf("时=%v\n",now.Hour())
fmt.Printf("分=%v\n",now.Minute())
fmt.Printf("秒=%v\n",now.Second())
结果:
now=2019-10-31 09:36:09.1612018 +0800 CST m=+0.002018701
now type=time.Time
年=2019
月=October
月=10
日=31
时=9
分=36
秒=9
格式化日期和时间
法一:使用Printf 或 SPrintf
1)直接用Printf格式化输出
fmt.Printf ("当前年月日 %d-%d-%d %d:%d:%d \n",now.Year(),now.Month(),now.Day(),now.Hour(),now.Minute(),now.Second())
结果:
当前年月日 2019-10-31 10:2:42
2)使用fmt.Sprintf语句赋值给变量,输出变量
dateStr :=fmt.Sprintf("当前年月日 %d-%d-%d %d:%d:%d \n",now.Year(), now.Month(),now.Day(),now.Hour(),now.Minute(),now.Second())
fmt.Printf("dataStr=%v\n",dateStr)
结果:
dataStr=当前年月日 2019-10-31 10:2:42
法二: 使用 time.Format()
fmt.Printf(now.Format("2006-01-02 15:04:05")) //now.Format ("2006-01-02 15:04:05")( 写死了,数字不能改变,否则出错)
fmt.Println()
fmt.Printf(now.Format("2006-01-02")) //格式为年月日,输出就为年月日;格式为年月,输出为年月
fmt.Println()
fmt.Println(now.Format("15:04:05"))
结果
2019-10-31 10:38:20
2019-10-31
10:38:20
Unix 和 UnixNano
Unix和Unixnano,可用于获取随机数字,
两者均为1970年1月1日到今天的时间戳,Unix为x秒数,UnixNano为纳秒数
可利用两点时间戳相减计算某一函数执行的时间,实例如下:
func test03(){
str :=""
for i :=0; i<100000; i++{
str +="hello" +strconv.Itoa(i)
}
}
func main(){
start :=time.Now().Unix()
test03()
end :=time.Now().Unix()
fmt.Printf("执行test03()耗费时间为%v秒\n",end-start) // 通过end—start来计算test03的执行时间
}
结果是:
执行test03()耗费时间为5秒
利用sleep函数可以获取指定时间单位的时间
实例:
每隔0.1秒中打印一个数字,打印到100时退出
func main(){
i :=0
for {
i ++
fmt.Println(i)
time.Sleep(time.Millisecond*100) // 时间为每间隔0.1秒执行一次循环
if i ==100 {
break
}
}
}
内置函数
len()
new():用来分配内存-----------*int
make(): 给引用类型分配内存
new用来分配内存,主要用来分配值类型,返回的是指针
num1 :=100
fmt.Printf("num1的类型%T\n num1的值=%v\n num1的地址%v\n",num1,num1,&num1)
num2 :=new(int)
*num2 =100
fmt.Printf("num2的类型%T\n num2的值=%v\n num2的地址%v\n num2指向的值=%v",num2,num2,&num2,*num2)
结果:
num1的类型int
num1的值=100
num1的地址0xc00000a0c8
num2的类型*int //通过new转换之后,值的类型变成了指针
num2的值=0xc00000a110 //值变成了地址
num2的地址0xc000006030
num2指向的值=100
原来
num1------>0xc00000a0c8 (100)
现在
num2------>0xc00000a110-------->0xc000006030(100)
错误处理
Go中错误处理机制,defer,panic,recover
Go中抛出一个panic的异常,然后在defer中通过recover捕获这个异常。
在默认情况下当发生错误时程序就退出来
引出错误处理:defer panic recover = go中可以抛出一个panic的异常,然后在defer 中通过recover捕获这个异常,然后正常处理
err:=recover()
1 排序和查找
排序
将一组数据以指定的顺序进行排序
冒泡排序
经过arr.length - 1 次的轮数,每一轮的次数逐渐减少,前面的数比后面的大时进行交换
for i:=0; i for j: =0;j if (arr)[j] > (arr)[j+1]{ //交换 temp = (*arr)[j] (arr)[j] = (arr)[ j +1] (*arr)[j+1]=temp } } } 查找 顺序查找(for循环),可以先定义一个index = -1,每次循环如果找到就将i赋给index 二分法查找(前提是已经排好序的) 先找到中间的下标middle=(leftindex+rightindex)/2,然后跟目标数进行比较 if leftindex>rightindex { 找不到 return } func index(arr *[6]int,leftindex int ,rightindex int ,findvalue int) middle := (leftindex+rightindex)/2 if (*arr)[middle] > findvalue{ index(arr,leftindex,middle-1,findvalue) }else if (*arr)[middle] < findvalue{ index(arr,middle+1,righetindex,findvalue) }else{ 找到了,下标就是middle }