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
*/

浙公网安备 33010602011771号