内置函数+递归+闭包
close
主要用来关闭channel
len
用来求长度,比如string,array,slice,map,channel
new
var i int fmt.Println(i) // 返回0 j := new(int) fmt.Println(j) // 返回一个地址 // 赋值 *j = 100
make
用来分配内存,主要分配引用类型,比如chan、map、slice
// new出来的是一个指针,指向切片的地址 s1 := new([]int) fmt.Println(s1) // 返回一个地址 // make出来的就直接是切片 s2 := make([]int, 10) // 第二个参数指定切片的长度 fmt.Println(s2) // 返回切片的值 // 赋值 *s1 = make([]int, 5) (*s1)[0] = 10 s2[0] = 10
用来追加元素到数组、slice中
var a []int // 定义切片,括号里面声明长度是数组,没有声明是切片 a = append(a, 10, 20, 30) // 将切片添加 a = append(a, a) // 这样是不可以的,需要将后面的a展开 a = append(a, a...)
用来做错误处理
func test() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
b := 0
a := 100 / b // recover()捕获这里的异常
return
}
// 自己抛异常
func initConfig() (err error) {
return errors.New("init config failed") // errors包
}
func test() {
err := initConfig()
if err != nil {
panic(err) // 抛出异常
}
}
一个函数调用自己,就叫做递归
func calc(n int) int {
if n == 1 {
return 1
}
return calc(n - 1) * n
}
递归的设计原则
-
一个大的问题能够分解成相似的小问题
-
定义好出口条件
func Adder() func(int) int {
var x int
return func(delta int) int {
x += delta
return x
}
}
func main() {
var f = Adder()
f(1) // 1
f(100) // 101
f(1000) // 1101
}
// 由此可见,闭包中的变量状态会一直保存

浙公网安备 33010602011771号