5 new
new是一个内置的函数,它的函数签名如下:
func new(Type) *Type
复制
1 2 3 4
- Type表示类型,new函数只接受一个参数,这个参数是一个类型
- *Type表示类型指针,new函数返回一个指向该类型内存地址的指针。
new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。举个例子: func main() {
a := new(int)
b := new(bool)
fmt.Printf("%T\n", a)
fmt.Printf("%T\n", b)
fmt.Println(*a)
fmt.Println(*b)
}
复制
1 2 3 4 5 6 7 8
5.1 new函数的示例type Point struct {
X, Y float64
}
func (p *Point) Abs() float64 {
return math.Sqrt(p.X*p.X + p.Y*p.Y)
}
func main() {
var p *Point
fmt.Println(p.Abs())
}
复制
1 2 3 4 5 6 7 8 9 10 11 12
问这个为什么会 panic?报错信息如下 panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x49a76a]
goroutine 1 [running]:
main.(*Point).Abs(...)
D:/go_project/src/github.com/ourlang/noUtil/test/main.go:132
main.main()
D:/go_project/src/github.com/ourlang/noUtil/test/main.go:137 +0x2a
复制
1 2 3 4 5 6 7 8
处理方法其实很简单,从报错内容可以看出是空指针引用,所以问题出在这里
var p *Point
var p *Point = new(Point)
var p *Point = &Point{}
复制
1 2 3 4 5 6 7 8 9 10
6 makefunc make(t Type, size ...IntegerType) Type
复制
1
make函数是无可替代的,我们在使用slice 、map 以及channel 的时候,都需要使用make进行初始化,然后才可以对它们进行操作。 7 new与make的区别- 二者都是用来申请内存的。
new 很少用,一般用来给基本类型申请内存的。并且内存对应的值为类型零值,返回的是指向类型的指针。比如string int 返回的是对应类型的指针(*string *int )make 只用于slice 、map 以及channel 的初始化,返回的还是这三个引用类型本身;
|