小白教程

 找回密码
 立即注册
小白教程 首页 系列教程 PHP系列教程 查看内容

Go语言指针

发布者: 小白教程



5 new

new是一个内置的函数,它的函数签名如下:

// The new built-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.
func new(Type) *Type
复制
1
2
3
4
  • Type表示类型,new函数只接受一个参数,这个参数是一个类型
  • *Type表示类型指针,new函数返回一个指向该类型内存地址的指针。

new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。举个例子:

func main() {
	a := new(int) //a就是一个*int(int类型的指针)
	b := new(bool)//b就是一个*bool (bool类型的指针)
	fmt.Printf("%T\n", a) // *int
	fmt.Printf("%T\n", b) // *bool
	fmt.Println(*a)       // 0
	fmt.Println(*b)       // false
}
复制
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

#处理方法

其实很简单,从报错内容可以看出是空指针引用,所以问题出在这里

// 这种声明方式 p 是一个 nil 值
var p *Point

// 改为
var p *Point = new(Point)

// 或者
var p *Point = &Point{}
//为什么这么改就可以呢,我们看看定义,大致意思是,new函数会分配内存,
//返回的值是一个指向该类型零值的地址。
复制
1
2
3
4
5
6
7
8
9
10

#6 make

func make(t Type, size ...IntegerType) Type
复制
1

make函数是无可替代的,我们在使用slicemap以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。

#7 new与make的区别

  • 二者都是用来申请内存的。
  • new很少用,一般用来给基本类型申请内存的。并且内存对应的值为类型零值,返回的是指向类型的指针。比如string int返回的是对应类型的指针(*string *int
  • make只用于slicemap以及channel的初始化,返回的还是这三个引用类型本身;
12
上一篇:Go语言基础之map下一篇:Go语言函数

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-11-24 18:52 , Processed in 0.029968 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

返回顶部