go-内置函数

创建数据

new

new函数用来创建某一个类型的指针型对象,理论上,只要一个数据类型能够被访问到,就能用new函数来创建指针类型的对象。返回值是一个指向新分配的type类型的零值的指针。

func new(Type) *Type

make

make函数也用于内存分配,和new不同的地方在于,make函数只能用于chan,map和切片三种类型的创建,返回值就是对象本身,因为这三类数据结构本身就是引用类型,必须要初始化

func make(t Type, size ...IntegerType) Type

// 创建切片
var a = make([]int, 3,4)

// 创建map
var b = make(map[int]string)

操作数据

append

go语言中的append函数作用是在切片变量的后面追加新的数据,然后返回新的切片变量

func append(slice []Type, elems ...Type) []Type

copy

copy函数把slice源的数据复制到目的切片中,需要注意的是,copy不会主动的扩展目的切片的容量,在目的slice填充满之后会舍弃超出的部分,返回的是复制成功的元素个数

若目的slice原来有元素,则会被覆盖掉

func copy(dst, src []Type) int

delete

delete函数用于删除map中对应key的键值对,如果map中不存在该key,则什么也不做

func delete(m map[Type]Type1, key Type)  // 没有返回值

获取数据属性

len

len函数用来获取字符串,切片,数组,通道,字典类型变量的内容长度,不同的类型,长度的计算规则不一致。

对于切片,字典,数组,通道类型的变量,他们中的每一个元素就是一个长度。

string类型的变量,每一个字节都是一个长度,中文字在utf8编码中占三个字节,故len获取string类型长度时,每一个汉字都是三个长度

len计算的是变量已有数据的内容长度,并非是变量的容量。
如果v是nil,则len(v)为0

func len(v Type) int

cap

cap函数用来计算切片,通道,数组类型变量的容量,即这个容器最多能装多少元素

如果v是nil,则cap(v) 容量获取到的是0

func cap(v Type) int

复数的操作

complex

complex 用于创建一个复数并返回

参数列表中r 为复数的实部,i 表示为复数的虚部

func complex(r,i FloatType) complexType

real

real函数用于获取一个复数的实部

func real(c ComplexType) FloatType

imag

imag函数用于获取一个复数的虚部

func imag(c ComplexType) FloatType

异常捕获

defer

延迟到当前函数的最后执行代码

// 指定最后执行的代码
// 多个defer的执行顺序,是先注册后执行
func testStruct() {
	type Hobby struct {
		name 	string
		int
	}
	a := Hobby{"小小", 19}
	b := Hobby{"小小", 19}
	fmt.Println(a==b)
}

func testDefer(){
    defer fmt.Println("我将在程序最后被执行")
    fmt.Println(1)
    defer fmt.Println("我也将在程序最后被执行")
    fmt.Println(2)
}

func main(){
    testDefer()
    testStruct()
}

/*
1
2
我也将在程序最后被执行
我将在程序最后被执行
true
*/

panic

panic函数表示程序中非常严重,不可恢复的错误
panic异常被抛出之后,会一层一层的上传至最外层,直至程序崩溃或者被recover函数捕获

panic不管引起程序崩溃或是被捕获,当前函数后面的代码都不会再执行(defer函数注册的代码除外)

// 相当于python中的raise,主动抛错

func testPanic(){
    defer fmt.Println("我将在testPanic函数的最后执行")
    panic("错误")
    fmt.Println("hello")  //不会被执行
}

/*
我将在testPanic函数的最后执行
panic: 错误
*/

recover

recover函数用于捕获程序中抛出的panic,并从当前被调用执行的位置开始继续执行代码

通常用于与defer函数连用

捕获的区域包括:当前代码行之后的所有区域

func testPanic(){
	defer func(){
        // 在defer函数内部执行recover,将会在当前defer所在的函数最后开始恢复程序
		if error:= recover();error!=nil{  
			fmt.Printf("error:%v \n",error)
		}
	}()
	panic("错误信息")
	fmt.Println("hello")  // 无论有没有恢复,都不会被打印
}

func main(){
    // 若是将testPanic内的defer代码放到main中,将会从main函数的最后开始恢复程序
    testPanic()
    fmt.Println("函数testPanic未出错或者出错被捕获了")
}

/*
error:错误信息 
函数testPanic未出错或者出错被捕获了
*/

关闭管道

close

close函数用于关闭一个非只读的管道。
close方法应该由管道的数据发送一方调用。
当最后一个发送的值被从管道中接收之后,后面的所有值接收都会非阻塞直接返回,返回值为元素类型的零值。
如果chan已经关闭,则x,ok := <- chan 中,ok为false

func close(c chan<- Type)
posted @ 2020-03-28 10:50  DongDon  阅读(80)  评论(0)    收藏  举报