zoukankan      html  css  js  c++  java
  • GO make&new区别

    自:http://www.cnblogs.com/ghj1976/archive/2013/02/12/2910384.html

    1、make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。

    2、new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:new返回指针。


    3、make(T, args)与new(T)有着不同的功能,make只能创建slice、map和channel,并且返回一个有初始值(非零)的T类型(引用),而不是*T。

    4、本质来讲,导致这三个内建类型有所不同的原因是:引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为nil。对于slice、map和channel来说,make初始化了内部的数据结构,填充适当的值。make返回初始化后的(非零)值。

    5、故make 是内建类型初始化的方法,例如:s :=make([]int,len,cap)  //这个切片在元素在超过10个时,底层将会发生至少一次的内存移动动作

      1. //创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间  
      2. b := make([]int, 5, 10) // len(b)=5, cap(b)=10  
      3. //继续切片,注意len和cap的变化  
      4. b = b[:cap(b)] // len(b)=5, cap(b)=5  
      5. b = b[1:]      // len(b)=4, cap(b)=4  
  • 相关阅读:
    MVC中添加执行统计功能
    SVN 全局忽略列表
    WebApi当中微软又犯了一次2
    SQL性能更总
    【懒人专用】快速构建Web请求
    js中模拟多个字母的split
    分页起始位置的懒汉判断方法
    文档摆放
    转: 多线程环境下调用 HttpWebRequest 并发连接限制
    bash命令根据历史记录补全
  • 原文地址:https://www.cnblogs.com/sysnap/p/6892921.html
Copyright © 2011-2022 走看看