zoukankan      html  css  js  c++  java
  • golang中的make与new

    golang 中有两个内存分配机制 :new和make,二者有明显区别.

      new:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。其自身是一个指针.可用于初始化任何类型

      make: 返回一个有初始值(非零)的T类型,而不是*T,其只能用来初始化:slice,map和channel三种类型。

    对比:

    1. 适用范围:make 只能创建内建类型(slice map channel), new 则是可以对所有类型进行内存分配
    2. 返回值: new 返回指针, make 返回引用
    3. 填充值: new 填充零值, make 填充非零值

    代码:

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    type Books struct {
        Title,
        Content,
        Author string
    }
    
    func main() {
    
        a := new([]int)
        fmt.Println(a)
        //输出&[],a本身是一个地址
        b := make([]int, 1)
        fmt.Println(b)
        //输出[0],b本身是一个slice对象,其内容默认为0
    
        book1 := new(Books)
        book1.Title = "this is book1 title"
        book1.Content = "this is book1 content"
        book1.Author = "this is book1 author"
        book2 := Books{"this is book2 title", "this is book2 content", "this is book2 author"}
        fmt.Println("book1:", book1, ",Type:", reflect.TypeOf(book1)) 
      //book1: &{this is book1 title this is book1 content this is book1 author} ,Type: *main.Books fmt.Println("book2:", book2, ",Type:", reflect.TypeOf(book2))
      //book2: {this is book2 title this is book2 content this is book2 author} ,Type: main.Books }
    指针和引用的区别:
      相同点:
        都是地址的概念
        指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
      不同点:
        指针是一个实体,而引用仅是个别名
        引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
        引用是类型安全的,而指针不是 (引用比指针多了类型检查
     
    指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)
     
    而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址(int &a的形式)。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
     
  • 相关阅读:
    net start mongodb 提示:发生系统错误 5,拒绝访问。
    jquery下载所有版本
    国内优秀开源镜像站汇总
    bootstrap导航条报错 Uncaught TypeError: Cannot convert object to primitive value
    null的坑 和 比较运算符、相等运算符的隐式转换问题 (在javascript中,null>=0 为真,null<=0 为真,null==0却为假,null到底是什么?)
    关于 圣杯布局(双飞翼布局)的一些想法
    如何制作图标字体(如何将svg转换为css可用的图标字体)
    VirtualBox-虚拟硬盘扩容-win7
    前端JS导出表格
    JS判断是否是IE浏览器
  • 原文地址:https://www.cnblogs.com/xbblogs/p/9507351.html
Copyright © 2011-2022 走看看