zoukankan      html  css  js  c++  java
  • 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 
     ", p1) //(*int)(0xc42000e250) 
    fmt.Printf("p1 point to --> %#v 
     ", *p1) //0
    var p2 *int
    i := 0
    p2 = &i
    fmt.Printf("p2 --> %#v 
     ", p2) //(*int)(0xc42000e278) 
    fmt.Printf("p2 point to --> %#v 
     ", *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 
     ", s1) // []int(nil)
    	}
    	s2 := make([]int, 3)
    	if s2 == nil {
    	 fmt.Printf("s2 is nil --> %#v 
     ", s2)
    	} else {
    	 fmt.Printf("s2 is not nill --> %#v 
     ", 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}

  • 相关阅读:
    Linq
    正则表达式
    XPath
    winFrom http协议
    CSS选择器
    Action方法
    Code First开发方式
    Database First开发方式
    可选参数,程序暂停,属性的初始化,String.Format改进
    Lambda表达式和LTNQ
  • 原文地址:https://www.cnblogs.com/wanghaijun999/p/8184274.html
Copyright © 2011-2022 走看看