首页 > 其他分享 >Golang基础-4

Golang基础-4

时间:2022-09-05 20:23:45浏览次数:92  
标签:切片 slice int fmt 基础 Golang 数组 var

日期和时间函数

获取当前日期和时间

time.Now()返回值是一个结构体类型是time.Time(结构体)

返回值的类型也有对应的方法获得具体的年,月,日,时,分,秒

比如:

image-20220904145508647

直接通过.xxx()的方式获取

image-20220904145754002

日期的格式化

fmt.Sprintf()有返回值可以得到字符串内容以便后续使用

image-20220904150339546

还有种方式是使用其返回值自带的Time.Format()注意里面的参数的数字固定了必须是(2006,01,02,15,04,05)分别对应了年月日时分秒,任意组合都是可以的要年日时:

now:=time.Now()
s:=now.Format("2006.02,15时")

image-20220904151138583

内置函数(内建函数)

可以不用导包直接使用的函数

包builtin下的函数全都不用导包

image-20220904152404512

常用的这两个其中len()比较简单

其中new(Type)*Type函数返回对应类型的指针,用于声明未命名的函数,初始值为此类型的零值,并返回其地址(指针存放的就是对应的地址)

p:=new (int)
fmt.Println(*P)//输出“0”

new()是预声明函数,不是关键字,所以可以重新定义

image-20220904152927870

错误处理机制

defer+recover

以下是一个错误案例

image-20220905092341413

错误处理/捕获机制:

image-20220905091630731

具体捕获代码如下

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)
}

image-20220905093056954

作用-可以暂时跳过err继续执行程序

自定义错误

image-20220905093600739

需要调用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
		}
}

image-20220905144845221

当我们出现错误时候,一般后面的代码都会受到影响,所以一般会在错误出现时中断

程序

这里要借助内置函数

image-20220905145100443

在上面例子的基础上加上panic函数、

image-20220905145316758

image-20220905145344994

可以看到程序被中断了

数组

定义方式;

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占了两个字节

image-20220905151540591

优点:访问速度快

例子:

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)
	}
}

image-20220905153403978

数组的初始化

定义的时候直接初始化

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)

image-20220905154758315

2.在go语言中数组属于值类型,在默认情况下是值传递(进行值的拷贝,不会改变实际的值,要想直接改变实际值要将指数类型作为参数传递如&scorces[i]

二维数组

声明格式:

var arr  [2][3]int16

image-20220905184355942

赋值操作和一维数组是一样的

初始化操作也是类似的

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()
	}

image-20220905190252620

切片

切片(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]

内存分析如下:

image-20220905192703222

获取切片的长度和容量

//长度
len(slice)
//容量,用内置函数cap()
cap(slice)

切片的定义

1.在数组上截取片段

slice := intarr[1:3]

2.通过内置函数make()来创建切片,基本语法 var 切片名[]Type=make([]Type,len,cap)

image-20220905193426777

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)
}

注意事项

image-20220905195033152

第四点就将已有切片当成一个数组创建一个新的切片

5,切片可以动态增长

用内置函数append()

image-20220905195754607

image-20220905200142467

如果是再切片后面追加切片可以这样写

slice := []int{2,3}
slice2 := []int{1,4,7}
slice = sppend(slice,slice2...)
//三个点必写代表追加切片,而且是切片中所有内容

切片的拷贝

用内置函数copy()

image-20220905200742182

slice := []int{2,3}
slice2 := []int{1,4,7}
copy(slice2,slice)//将slice内容复制到slice2中

注:拷贝互不影响只是低层创建了一个一模一样的新数组

标签:切片,slice,int,fmt,基础,Golang,数组,var
From: https://www.cnblogs.com/qwerty-wy/p/16659430.html

相关文章

  • 【图像处理笔记】图像分割基础知识
    形态学处理相同,图像分割操作的输入是图像,输出是从图像中提取出来的属性。本章的大多数分割算法都基于图像灰度值的两个基本性质之一:不连续性和相似性。第一类方法根据灰度......
  • 52 | JAVA_网络编程基础
    网络编程基础ip地址在互联网中,一个IP地址用于唯一标识一个网络接口(NetworkInterface)。一台联入互联网的计算机肯定有一个IP地址,但也可能有多个IP地址。IP地址又......
  • 【Java基础】package、import关键字和JDK中主要包
    1.package声明在源文件首行,每一个.表示一层文件夹,指明该类所在包,包名通常都小写。根据项目需要将代码放在不同包中2.import(1)导入指定包下所需要的类、接口,xxx.*表示......
  • 【Java基础】关键字this
    1.this是什么this是一个对象,表示当前对象或当前正在创建的对象2.使用在类的方法中,使用this.属性或this.方法调用当前对象属性或方法,但一般都省略。方法的形式参数和类......
  • three.js基础用法
    import*asTHREEfrom'../libs/build/three.module.js';import{OrbitControls}from'../libs/jsm/controls/OrbitControls.js'import{CSS2DRenderer,CSS2DObje......
  • 【Java基础】JavaBean是什么
    1.JavaBean是什么符合如下标准的Java类类是公共的public有一个无参的公共的构造器有属性,且有对应的get、set方法2.示例publicclassJavaBean{privateStrin......
  • 【Java基础】类的结构之三:构造器(构造方法)
    1.构造器是什么也称为构造方法、构造函数。(1)方法名与类名相同(2)没有返回值类型(3)不能被static、final、synchronized、abstract、native修饰publicclassCircle{......
  • golang指定客户端的端口
    当客户端去连接服务端时,端口号是随机的,如果需要指定客户端端口号,就不要指定IP,否则会一直报错的,程序如下:netAddr:=&net.TCPAddr{Port:51860}d:=net.Dialer{......
  • Markdown基础使用学习
    MarkDown学习标题:#+标题名字二级标题:##+标题名字三级... 字体两个*+字+两个=加粗一个=斜体引用一个大于号+内容 图片!【图片名字】(路径)符号全部小写 ......
  • C# ADO.NET 数据库访问的基础类
    1usingSystem;2usingSystem.Data;3usingSystem.Data.SqlClient;45namespaceSQLServerAccess6{7///<summary>8///数据库访......