go 语言 make and new

Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。

变量的申明:

var i int

var s string

变量的声明我们可以通过var关键字,然后就可以在程序中使用。当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如int类型的零值是0,string类型的零值是"",引用类型的零值是nil

对于例子中的两种类型的声明,我们可以直接使用,对其进行赋值输出。但是如果我们换成引用类型呢?

package main
import (
    "fmt"
)
func main() {
    var i *int
    *i=10
    fmt.Println(*i)

}

  

这个例子会打印出什么?0还是10?。以上全错,运行的时候会painc,原因如下:

panic: runtime error: invalid memory address or nil pointer dereference

从这个提示中可以看出,对于引用类型的变量,我们不光要声明它,还要为它分配内容空间,否则我们的值放在哪里去呢?这就是上面错误提示的原因。

对于值类型的声明不需要,是因为已经默认帮我们分配好了。

要分配内存,就引出来今天的newmake

func main() {
    var i *int
    i=new(int)
    *i=10
    fmt.Println(*i)

}

  

1,new

定义:

func new(Type) *Type   

说明:内建函数 new 用来分配内存,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针,指向分配类型的内存地址。

p1 := new(int)
fmt.Printf("p1 --> %#v \n ", p1) //(*int)(0xc42000e250) 
fmt.Printf("p1 point to --> %#v \n ", *p1) //0
var p2 *int
i := 0
p2 = &i
fmt.Printf("p2 --> %#v \n ", p2) //(*int)(0xc42000e278) 
fmt.Printf("p2 point to --> %#v \n ", *p2) //0

  上面的代码是等价的,new(int) 将分配的空间初始化为 int 的零值,也就是 0,并返回 int 的指针,这和直接声明指针并初始化的效果是相同的。

2.make

定义:

func make(Type, size IntegerType) Type

说明:内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型,

Slice: 第二个参数 size 指定了它的长度,它的容量和长度相同。
你可以传入第三个参数来指定不同的容量值,但必须不能比长度值小。
比如 make([]int, 0, 10)

Map: 根据 size 大小来初始化分配内存,不过分配后的 map 长度为 0,如果 size 被忽略了,那么会在初始化分配内存时分配一个小尺寸的内存

Channel: 管道缓冲区依据缓冲区容量被初始化。如果容量为 0 或者忽略容量,管道是没有缓冲区的

slice   map   channel本身是引用类型的。

     var s1 []int
	if s1 == nil {
	 fmt.Printf("s1 is nil --> %#v \n ", s1) // []int(nil)
	}
	s2 := make([]int, 3)
	if s2 == nil {
	 fmt.Printf("s2 is nil --> %#v \n ", s2)
	} else {
	 fmt.Printf("s2 is not nill --> %#v \n ", s2)// []int{0, 0, 0}
	}

  

        var a [5]int
	var b = a[1:3]
	a[0] = 100
	a[1] = 200
	fmt.Printf("%d,%d",b[0],b[1])//b[0] = 200,b[1] = 0
	var a [5]int
	var b = a[1:3]
	b[0] = 100
	b[1] = 200	
	fmt.Printf("%d,%d",a[1],a[2])// a[1] = 100,a[2] = 200

  从上面的例子中看出,切片b[0]指向了a[1]。而 s2 := make([]int, 3)相当于var s2 []int     s2= []int{0,0,0}

 

posted @ 2018-01-03 16:09  whj999  阅读(146)  评论(0编辑  收藏  举报