- close:主要用来关闭channel
- len:用来求长度,比如string、array、slice、map、channel
- new:用来分配内存,主要用来分配值类型,比如int、struct。返回指针
- make:用来分配内存,主要用来分配引用类型,比如chan、map、slice
- append:用来追加元素到数组、切片中
- panic和recover:用来做错误处理
package main
import(
"fmt"
"time"
"errors"
)
func initConfig() (err error){
return errors.New("init config failed")
}
func test(){
defer func(){ //匿名函数,用来捕获异常
if err:= recover(); err !=nil{
fmt.Println(err)
}
}()
b := 0
a := 100 / b
fmt.Println(a)
return
}
func test_config(){
err := initConfig()
if err != nil{
panic(err)
}
return
}
func main(){
for {
test_config()
test()
time.Sleep(time.Second*2)
}
var a []int
a = append(a,1,2,3)
a = append(a,a...) //如果切片中append切片时,使用... |||| ...是切片的展开
fmt.Println(a)
}
new 和 make的区别
new 函数
官方文档描述为:
The new build-in function allocates memory(仅仅分配空间). The first argument is a type, not a value, and the value returned is a pointer to a newly allocated zero value of that type.
翻译如下:
内置函数 new 分配空间。传递给new 函数的是一个类型,不是一个值。返回值是 指向这个新分配的零值的指针。
make 函数
官方描述为:
The make built-in function allocates and initializes an object(分配空间 + 初始化) of type slice, map or chan(only). Like new , the first arguement is a type, not a value. Unlike new, make’s return type is the same as the type of its argument, not a pointer to it. The specification of the result depends on the type.
翻译为:
内建函数 make 分配并且初始化 一个 slice, 或者 map 或者 chan 对象。 并且只能是这三种对象。 和 new 一样,第一个参数是 类型,不是一个值。 但是make 的返回值就是这个类型(即使一个引用类型),而不是指针。 具体的返回值,依赖具体传入的类型。
Slice : 第二个参数 size 指定了它的长度,此时它的容量和长度相同。
你可以传入第三个参数 来指定不同的容量值,但是必须不能比长度值小。
比如: make([]int, 0, 10)
Map: 根据size 大小来初始化分配内存,不过分配后的 map 长度为0。 如果 size 被忽略了,那么会在初始化分配内存的时候 分配一个小尺寸的内存。
Channel: 管道缓冲区依据缓冲区容量被初始化。如果容量为 0 或者被 忽略,管道是没有缓冲区的。
总结
new 的作用是 初始化 一个指向类型的指针 (*T), make 的作用是为 slice, map 或者 channel 初始化,并且返回引用 T
make(T, args)函数的目的与new(T)不同。它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是T*)的一个初始化的(不是零值)的实例。 这中差别的出现是由于这三种类型实质上是对在使用前必须进行初始化的数据结构的引用。 例如, Slice是一个 具有三项内容的描述符,包括指向数据(在一个数组内部)的指针,长度以及容量。在这三项内容被初始化之前,Slice的值为nil。对于Slice,Map和Channel, make()函数初始化了其内部的数据结构,并且准备了将要使用的值。
package main
import(
"fmt"
)
func test(){
a := new([]int)
b := make([]int,5)
(*a)[0] = 100
b[0] = 100
fmt.Println(a,b)
}
func main(){
test()
}
输出结果:
panic: runtime error: index out of range
*a指向的是[]int,需要给*a进行make初始化,才可以赋值
*a = make([]int,5)
网友评论