1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var i *int
  7. *i=10
  8. fmt.Println(*i)
  9. }
  10. 输出:
  11. panic: runtime error: invalid memory address or nil pointer dereference
  12. [signal 0xc0000005 code=0x1 addr=0x0 pc=0x105b6a]
  13. goroutine 1 [running]:
  14. main.main()
  15. C:/Users/LZ.LI/Desktop/code/learn/main.go:9 +0x2a

对于引用类型的变量,我们不光要声明它,还要为它分配内容空间
正确的做法:

  1. func main() {
  2. var i *int
  3. i=new(int)
  4. *i=10
  5. fmt.Println(*i)
  6. }

New

  1. // The new built-in function allocates memory. The first argument is a type,
  2. // not a value, and the value returned is a pointer to a newly
  3. // allocated zero value of that type.
  4. func new(Type) *Type

它只接受一个参数,这个参数是一个类型,分配好内存后,返回一个指向该类型内存地址的指针。同时请注意它同时把分配的内存置为零,也就是参数类型的零值。它返回的永远是类型的指针,指向分配类型的内存地址。

make

只用于

  • chan
  • map
  • slice

它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。