go语言开发基础15 - 之go语言里的内置函数:close、len、new、make、append、panic和recover

内置函数是go语言里已经定义好的函数,直接用就可以。

 

一、close函数

close函数主要用来关闭channel(管道),具体示例见make函数示例。

 

二、len函数

len函数主要用来统计类型的长度,示例如下:

package main

import "fmt"

func main() {
    fmt.Println(len("Hello"))         // 结果为:5
}

  

三、new函数

new函数用来分配内存,主要分配值类型,比如:“int”、“struct”,返回的是指针。示例如下:

package main

import "fmt"

func main() {
	var i int       // 1.定义一个int类型的变量i
	fmt.Println(i)   // 2.打印变量i,结果为:0,(int类型变量的默认值为0)

	j := new(int)     // 3.使用new分配一个内存地址赋值给变量j
	fmt.Println(j)    // 4.打印变量j,结果为:0xc0000100b0
	*j = 5       // 5.将5赋值给变量j的指针
	fmt.Println(*j)     // 6.打印变量j的指针,结果为:5
}

 

四、make函数

make函数用来分配内存,主要用来分配引用类型,如:“chan”、“map”、“slice”,返回值类型。示例如下:

package main

import "fmt"

func Add(a int, b int, c chan int) {
	sum := a + b     // 4.做加法运算
	c <- sum         // 5.将计算的结果写入管道
}

func main() {
	var pipe chan int         // 1.定义一个chan int(int类型的管道)类型的变量
	pipe = make(chan int, 1)       // 2.使用make初始化管道变量,管道长度是1(长度是指这个管道里可以写入多少个元素)
	Add(5, 8, pipe)        // 3.调用Add函数并传参
	sum := <-pipe      // 6.从管道里读取内容并赋值给变量
	fmt.Println("Sum=", sum)       // 打印读取到的值
	close(pipe)       // 关闭管道
}

  

4.1、new和make函数的区别

package main

import "fmt"

func main() {
    s1 := new([]int)
    fmt.Println(s1)        // new()函数返回的是内存地址,结果为:&[]

    s2 := make([]int, 5)
    fmt.Println(s2)       // make()函数可以初化切片,返回结果为值类型,结果为:[0 0 0 0 0]

    *s1 = make([]int, 5)    // 初始话s1切片
    (*s1)[0] = 100           // 将切片下标为0的值赋值为100
    s2[0] = 100             // 将切片下标为0的值赋值为100

    fmt.Println("s1: ", *s1, "\ns2:", s2) // 结果为:s1:  [100 0 0 0 0]  , s2: [100 0 0 0 0]
}

  

 

五、append函数

append函数用来追加元素到数组、slice(切片)中,示例如下:

package main

import "fmt"

func main() {
	var a []int               // 1.定义切片
	a = append(a, 10, 20, 30)       // 2.往切片里追加三个内容
	fmt.Println(a)        // 3.打印结果,结果为:[10 20 30]
	a = append(a, a...)       // 3. 将a这个切片用...展开,然后追加到a这个切片里
	fmt.Println(a)            // 4.打印结果,结果为:[10 20 30 10 20 30]

}

  

六、panic和recover函数

panic和recover函数是组合使用用来做错误处理的,示例如下:

6.1、没做处理的报错示例

package main

import "fmt"

func main() {
	b := 0
	a := 100 / b       // 100除以0会报错,panic了。panic后这个程序就结束了
	fmt.Println(a)
}

/* 报错信息: panic: runtime error: integer divide by zero // 提示整数除以0了 goroutine 1 [running]: main.main() E:/Scripts/go/src/go_dev/day01/9_panic-recoverDemo/main.go:7 +0x11 // 提示在7行有错误 */

  

6.2、使用recover捕获系统panic的报错处理报错示例:

当程序执行时报错会触发panic,panic后程序就停止了,如果不是重要的报错,出现报错后我们还想让程序继续执行,可以用recover来捕获panic的报错。示例如下:

package main

import "fmt"

func panicDemo1() {
	defer func() {        // 2.使用defer定义匿名函数,5.函数结束前会执行defer
		if err := recover(); err != nil {      // 6.使用recover捕获panic错误
			fmt.Println(err)      // 7.打印panic错误
		}
	}()
	b := 0         // 3.设置b变量
	a := 100 / b       // 4.除法运算,100除以0会报错,这里会panic(panic后程序不会再继续向下执行)
	fmt.Println(a)
	fmt.Println("in panicDemo...")
}

func main() {
	panicDemo1()       // 1.调用panicDemo1函数
	fmt.Println("in main...")     // 8.执行这里
}

  

6.3、使用panic抛出异常

假设程序在初始化时读取配置文件出错了,在向下执行也是报错,此时就可以用panic抛出异常,示例如下:

package main

import (
	"errors"
	"fmt"
)

func initConfig() (err error) {
	return errors.New("init config failed!!")
}

func panicDemo1() {
	err := initConfig()
	if err != nil {
		panic(err)
	}
}

func main() {
	panicDemo1()
	fmt.Println("in main...")
}

// 执行后报错信息如下:
/*
panic: init config failed!!

goroutine 1 [running]:
main.panicDemo1(...)
        E:/Scripts/go/src/go_dev/day01/9_panic-recoverDemo/main.go:15
main.main()
        E:/Scripts/go/src/go_dev/day01/9_panic-recoverDemo/main.go:20 +0x62
exit status 2
*/

  

 

posted @ 2020-05-29 16:34  欧-阳  阅读(661)  评论(0)    收藏  举报