Golang基础-4
日期和时间函数
获取当前日期和时间
time.Now()
返回值是一个结构体类型是time.Time
(结构体)
返回值的类型也有对应的方法获得具体的年,月,日,时,分,秒
比如:
直接通过.xxx()的方式获取
日期的格式化
fmt.Sprintf()
有返回值可以得到字符串内容以便后续使用
还有种方式是使用其返回值自带的Time.Format()
注意里面的参数的数字固定了必须是(2006,01,02,15,04,05)分别对应了年月日时分秒,任意组合都是可以的要年日时:
now:=time.Now() s:=now.Format("2006.02,15时")
内置函数(内建函数)
可以不用导包直接使用的函数
包builtin下的函数全都不用导包
常用的这两个其中len()
比较简单
其中new(Type)*Type函数返回对应类型的指针,用于声明未命名的函数,初始值为此类型的零值,并返回其地址(指针存放的就是对应的地址)
p:=new (int) fmt.Println(*P)//输出“0”
new()是预声明函数,不是关键字,所以可以重新定义
错误处理机制
defer+recover
以下是一个错误案例
错误处理/捕获机制:
具体捕获代码如下
func main(){ test() fmt.Println("方法执行成功") fmt.Println("继续执行下面代码") } func test(){ //利用defer+recover来捕获错误:defer后加上匿名函数的调用 defer func(){ // 调用recover内置函数,可以捕获错误 err:=recover() // 如果没有错误产生,返回零值-nil if err != nil{ fmt.Println("错误已经捕获") fmt.Println("err是:",err) } }() num1:=10 num2:=0 result:=num1/num2 fmt.Println(result) }
作用-可以暂时跳过err继续执行程序
自定义错误
需要调用errors包下的New()函数
package main import ( "fmt" "errors" ) func main(){ err := test() if err !=nil{ fmt.Println("自定义错误是:",err) } fmt.Println("方法执行成功") fmt.Println("继续执行下面代码") } func test()(err error){ num1:=10 num2:=0 if num2 == 0{ return errors.New("除数不能为零") }else{ result:=num1/num2 fmt.Println(result) // 如果没有错误返回一个零值-nil return nil } }
当我们出现错误时候,一般后面的代码都会受到影响,所以一般会在错误出现时中断
程序
这里要借助内置函数
在上面例子的基础上加上panic函数、
可以看到程序被中断了
数组
定义方式;
var 数组名 [数组大小]Type
例子:
var scorces [5]int var sum int = 0 scorces[0]=95 scorces[1]=95 scorces[2]=95 scorces[3]=95 scorces[4]=95 //求和 for i:=o;i<len(scorces);i++{ sum+=scores } avg := sum/len(scorces) fmt.Println(avg)
数组的内存分析如下
注意根据类型决定乘以几,这里乘以2是因为int16占了两个字节
优点:访问速度快
例子:
func main(){ var scorces [5]int // 循环+Scanln来从终端录入学生成绩 for i:=0;i<len(scorces);i++{ fmt.Printf("请录用第%d的学生成绩",i+1) fmt.Scanln(&scorces[i]) } // 展示学生成绩 for i:=0;i<len(scorces);i++{ fmt.Printf("第%d个学生的成绩为:\t%d\n",i+1,scorces[i]) } fmt.Println(".................................") // 用for range遍历数组 for i,value:=range scorces{ fmt.Printf("第%d个学生的成绩为:\t%d\n",i+1,value) } }
数组的初始化
定义的时候直接初始化
var arr1 [3]int = [3]int{3,6,8}
var arr2 = [3]int{1,4,5}
var arr3 = [...]int{4,5,6,7,8}
4.指定下标对应值
var arr3 = [...]int{2:4,5:5,20:6,0:7,3:8}
注意事项
1.长度属于类型的一部分
var scorces [5]int fmt.Printf("数组的类型为%T",scorces)
2.在go语言中数组属于值类型,在默认情况下是值传递(进行值的拷贝,不会改变实际的值,要想直接改变实际值要将指数类型作为参数传递如&scorces[i]
)
二维数组
声明格式:
var arr [2][3]int16
赋值操作和一维数组是一样的
初始化操作也是类似的
var arr [2][3]int = [2][3]int{{1,4,7},{2,5,8}}
二维数组的遍历
var arr [3][3]int = [3][3]int{{1,4,7},{2,5,8},{3,6,9}} // 遍历二维数组 普通for for i:=0;i<len(arr);i++{ for j:=0;j<len(arr[i]);j++{ fmt.Print(arr[i][j],"\t") } fmt.Println() } fmt.Println(".................................") // 遍历二维数组 for range for key,value:=range arr{ for k,v:=range value{ fmt.Printf("arr=[%v][%v]的值=%v\t",key,k,v) } fmt.Println() }
切片
切片(slice)是一种建立在数组类型上抽象,是对数组一个连续片段的引用,是一个引用类型。这个片段可以是整个数组,也可以是由起始位置索引标识的一些 项的子集,注意终止的索引标识不包括在切片内相关于[ ),切片提供了一个相关数组的动态窗口
声明格式:(因为其建立在数组的基础上,所以创建需要数组)
var intarr [6]int = [6]int{2,5,6,7,3,4} //切片建立在数组之上 //创建一个切片叫slice,长度是动态的所以不写 var slice []int = intarr[1:3] //这里int是类型,intarr数字名,1是开始位置索引,3是结束位置,包括了1,不包括3 、、、下面是一样的 slice := intarr[1:3]
内存分析如下:
获取切片的长度和容量
//长度 len(slice) //容量,用内置函数cap() cap(slice)
切片的定义
1.在数组上截取片段
slice := intarr[1:3]
2.通过内置函数make()来创建切片,基本语法 var 切片名[]Type=make([]Type,len,cap)
slice := make([]int,4,20)
以上三个参数分别是
1.切片的类型
2.切片的长度
3.切片的容量
注意:这种方式是make底层创建一个数组,所以不可以直接操作这个数组,要通过slice去间接的访问各个元素
3.定义一个切片,直接就指定具体数组,类似于make方式
slice2 := []int{1,4,7}
遍历
1.普通for
slice := make([]int,4,20) slice[0]=44 slice[1]=45 slice[2]=46 slice[3]=47 for i:=0;i<len(slice);i++{ fmt.Printf("slice[%v]=%v \t",i,slice[i]) }
2.for range
for i,value := range slice{ fmt.Printf("slice[%v]=%v \t",i,value) }
注意事项
第四点就将已有切片当成一个数组创建一个新的切片
5,切片可以动态增长
用内置函数append()
如果是再切片后面追加切片可以这样写
slice := []int{2,3} slice2 := []int{1,4,7} slice = sppend(slice,slice2...) //三个点必写代表追加切片,而且是切片中所有内容
切片的拷贝
用内置函数copy()
slice := []int{2,3} slice2 := []int{1,4,7} copy(slice2,slice)//将slice内容复制到slice2中
注:拷贝互不影响只是低层创建了一个一模一样的新数组
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)