先整明白go里面的几大变量“类型”(不严谨,只是个人在使用的时候常用到的结构的一个划分)
(1) 值类型: int32, string, struct 这种
(2) 引用类型:主要是map, slice,chan 这三个引用(make创建内存的)
(3)指针类型:那就多了, *int64, *struct…


(1)对于值类型的变量,我们通过var 声明(包括结构体),系统会默认为他分配内存空间,并赋该类型的零值。如下,我们声明一个int类型变量i,输出为0。

var i int
fmt.Println(i) //i=0

而如果我们声明一个指针类型的变量,系统不会为他分配内存,默认就是nil。此时如果你想直接使用,那么系统会抛异常。

var j *int
fmt.Println(j)
*j = 10  //invalid memory address or nil pointer dereference

也就是说,空指针还没有内存分配,是不能使用的。

那么要想使用,此时就需要new出场啦。

var j *int
j = new(int)  // 让j里面的内容指向一块分配好的内存地址,地址里面设置int的零值:0
fmt.Println(j)
fmt.Println(*j)
*j = 10
fmt.Println(*j)

声明指针类型变量后,通过new为他分配内存,有了内存空间,这个变量就可以自由的使用了。

来看一下new函数的签名:

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

**但是,**实际在工程使用中,通常是直接声明指针使用,不需要new操作。

make和new不同,make用于map, slice,chan 的内存创建,因为他们三个是引用类型,直接返回这三个类型本身。make签名是:

func make(t Type, size ...IntegerType) Type
  • make 是分配内存并初始化,初始化并不是置为零值

  • 与new一样,它的第一个参数也是一个类型,但是不一样的是,make返回的是传入的类型,而不是指针!

var c chan int //声明管道类型变量c,此时c还是nil,不可用;
fmt.Printf("%#v \n",c) //(chan int)(nil)
c = make(chan int)
fmt.Printf("%#v", c) //(chan int)(0xc000062060)声明管道类型变量c,此时c还是nil,不可用;
通过make来分配内存并初始化,c就获得了内存可以使用了。

所以,我们在使用map, slice,chan 的时候,需要先对他们用make初始化,然后在进行操作。

总结:

  1. new 和 make都是Go语言的两个内建函数,用于分配内存
  2. new 一般用来返回指针类型(一般不用),make返回引用类型(map, slice,chan 这三个引用)
  3. var 声明的 基本类型和struct这种已经分配了内存,并且赋零值了。

其他内容参考:distributor 代码里Test的各种实验。

golang:var、new、make区别及使用相关推荐

  1. React Native之(var和let区别 )(简单解构)(map对象遍历)(可变顺序参数和不可以变顺序参数函数)

    1 var和let区别 let左右范围在块里面,var定义的变量可提升,用let声明的变量不可以声明2次 2 简单解构 let [a, b, c] = [1, 2, 3]; 3  map对象遍历 co ...

  2. swift中的let和var有什么区别?

    本文翻译自:What is the difference between `let` and `var` in swift? What is the difference between let an ...

  3. Web前端必做笔记之一:let, var, const的区别

    Web前端必做笔记之一:let, var, const的区别 <script>//var//没有块级作用域,只有函数作用域,支持变量提升console.log(a); var a = 10 ...

  4. ES6 | let、const以及与var之间的区别

    目录 一.let 1.声明变量 2.块儿级作用域 3.不存在变量提升 4.不影响作用域链 二.const 1.声明常量 2.一般常量使用大写(潜规则) 3.常量的值不能修改 4.块儿级作用域(cons ...

  5. golang和python的区别_golang和python的区别

    golang和python的区别 1.可扩展性 任何现代企业中的软件的首要事情之一就是可扩展性. 企业迅速增长,IT系统支持这种增长势在必行.这里值得一提的是,基于Python的Web应用程序很难在单 ...

  6. golang var 初始化时机_你应该知道的 Go 调度器知识:Go 核心原理 — 协程调度时机...

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 本文作者:叶不闻 原文链接:https://juejin.im/post/5dafc241f265da ...

  7. java有var吗_java – Var和Var之间的区别

    tldr; 虽然var和var都会将它们应用到的变量增加,但var返回的结果是变量在递增前的值,而var返回的结果是应用增量后的变量值. 进一步说明 当var或var形成完整的语句(如在你的例子中), ...

  8. javascript和var之间的区别?

    You can define your variables in JavaScript using two keywords - the let keyword and the var keyword ...

  9. JS中var和let区别

    1.let声明的变量是块级作用域(所在花括号里),var是函数作用域和全局作用域      注意:let是可以定义全局变量,局部变量,块级作用域的变量. 2.let声明的变量只在其声明的块或子块中可用 ...

  10. php call_user_func和,php – call_user_func()和$var()之间有区别吗?

    call_user_func()和它的语法糖版本之间是否有任何区别-- // Global function $a = 'max'; echo call_user_func($a, 1, 2); // ...

最新文章

  1. python模拟高并发_Python基于gevent实现高并发代码实例
  2. java类Timer和TimerTask的使用
  3. 20应用统计考研复试要点(part37)--概率论与数理统计
  4. CSS快速学习8:圆角切图、滚动条和图片整合技术
  5. 关闭内核Debug_log打印!
  6. C# HttpWebRequest 填充IP代理
  7. Unity 基础 之 Camera摄像机属性介绍
  8. python之Django框架将sqliteman数据库数据显示在页面上
  9. php判断手机号码归属地,手机号码归属查询大全所在位置(PHP通过API获取手机号码归属地)...
  10. C# WPF 低仿网易云音乐(PC)歌词控件
  11. 鸿蒙系统更新支持哪些手机,已经发布的鸿蒙系统都支持哪些手机型号呢?快来看看你的手机支持不!...
  12. 速通AOSP,成功编译调试Android源码
  13. (送票)2020广州敏捷之旅暨第11届广州DevOps社区Meetup火热报名中!
  14. Windows下python程序报错Nomodule named 'gevent'解决及ERROR: xxx.whl is not a supported wheel on this platform
  15. phpexcel删除行_在PHPexcel中删除空行
  16. 安卓java 模拟点击类_Android模拟用户点击的实现方法
  17. C++金拱门点餐结算系统_餐厅点单结算系统
  18. (环境搭建+复现)74CMS模版注入+文件包含getshell
  19. java 骰子游戏_java 骰子游戏
  20. 神奇太阳能电池:自动跟着太阳走

热门文章

  1. 5G无线技术基础自学系列 | 基站数量计算
  2. 05-02JavaScript流程控制---循环语句
  3. nvm切换node失败,原因:网速慢文件下载不全,使用淘宝镜像加速下载
  4. 数据结构:头指针,头结点详解(新手.小白)
  5. 招聘微码开发工程师---华为三康技术有限公司
  6. excel表格内容拆分_一键批量拆分Excel工作表【模板下载】
  7. 隐私计算商业化,原语科技的开源路线是否最优解?
  8. SQL 基础(一)创建、查看、修改、删除数据库
  9. 计算机毕业设计Java智慧校园食堂点餐系统(源码+系统+mysql数据库+lw文档)
  10. 赴兄弟连学习缘由并序