博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang:var、new、make区别及使用
阅读量:3951 次
发布时间:2019-05-24

本文共 1337 字,大约阅读时间需要 4 分钟。

先整明白go里面的几大变量“类型”(不严谨,只是个人在使用的时候常用到的结构的一个划分)

(1) 值类型: int32, string, struct 这种
(2) 引用类型:主要是map, slice,chan 这三个引用(make创建内存的)
(3)指针类型:那就多了, *int64, *struct…


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

var i intfmt.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的零值:0fmt.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的各种实验。

转载地址:http://qnkzi.baihongyu.com/

你可能感兴趣的文章
linux学习之shell脚本if判断参数-n,-d,-f等
查看>>
linux学习之windos文件在linux里面乱码解决
查看>>
idea快捷键
查看>>
linux学习之shell遍历数组
查看>>
python函数取参及默认参数使用
查看>>
linux学习之shell中的${},##, %% , :- ,:+, ? 的使用
查看>>
Spring学习之Filter、Interceptor、Aop实现与区别
查看>>
Spring 添加@Autowired注释, 注入对象却为空
查看>>
springSecurity学习
查看>>
通过Java的api操作redis
查看>>
jquery基本选择器
查看>>
linux学习之shell字符串大小写转换
查看>>
Linux下用base64对字符串进行加密解密
查看>>
H5走迷宫小游戏
查看>>
mysql建表 表名与关键字冲突
查看>>
mysql 创建单表外键关联多表
查看>>
postman使用
查看>>
ClassNotFoundException和NoClassDefFoundError的区别
查看>>
Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化
查看>>
spring注解@Primary与@Qualifier
查看>>